9.28-PRIM算法(//最短公路连接村庄(一)(二))

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengchencheng/article/details/82878583

1.最少修建多长的公路能把所有村庄连起来(一)

描述:一个地区有n个村庄,有一些村子之间可以修路,已知每条路的长度,问最少修建多长的公路可以把所有的村子连接起来。

输入:先输入两个正整数n,m(n小于10000,m小于100000),表示有n个村庄,m条可以修建的路,接下来的m行每行三个整数,前两个表示村庄的编号(0~n-1),第三个表示这条路的长度。

输出:输出路的总长度的最小值。

输入样例

4 5
0 1 10
0 2 13
1 2 1
1 3 5
3 0 8

输出样例

14

#include<iostream>
#include<stdlib.h> 
#define MAX 100000
using namespace std;

void init();
void find();

typedef struct node{
	int num;
	int len;
	node* next;
}node;

typedef struct road{
	node* matrix[10001];
}road;

road *p = (road*)malloc(sizeof(road));

int n, m;
int a[10001];
int FLAG = 1;
int cnt = 0;

int main(){
    init();
	find();
	cout << cnt << endl;
}

void init(){
	int u, v, s;
    cin >> n >> m;
	node *r;
	for(int i = 0; i < n; i++){
	    p->matrix[i] = NULL;
	    a[i] = 1;
	}
	for(int i = 0; i < m; i++){
	    cin >> u >> v >> s;
	    //将与v相连的数字储存,两点间距离储存在p->matrix[v]中 
		node *q1 = (node*)malloc(sizeof(node));	
		q1->num = u;
		q1->len = s;
		if(p->matrix[v] == NULL || p->matrix[v]->num <= u){
		    q1->next = p->matrix[v];
			p->matrix[v] = q1;
		}
		else{
			r = p->matrix[v];
			while(r->next->num > u){
				r=r->next;
			}
			q1->next = r->next;
			r->next = q1;
		}
		//将与u相连的数字储存,两点间距离储存在p->matrix[u]中 
		node *q2 = (node*)malloc(sizeof(node));
		q2->num = v;
		q2->len = s;
		if(p->matrix[u] == NULL || p->matrix[u]->num <= v){
		    q2->next = p->matrix[u];
			p->matrix[u] = q2;
		}
		else{
			r = p->matrix[u];
			while(r->next && r->next->num > v){
				r = r->next;
			}
			q2->next = r->next;
			r->next = q2;
		}
	}
	a[0] = 0;
}

void find(){
    int min, tmp;
	int i;
	node* r;
	while(FLAG){
		FLAG = 0;
		min = MAX;
		//一次搜索所有距集合中的节点最短路径的新节点 
	    for(i = 0; i < n; i++){
		    if(a[i] == 0){
		        r = p->matrix[i];		        
                while(r != NULL){
		            if(r->len < min && a[r->num]){
		                tmp = r->num;
			            min = r->len;
		            }
		            r = r->next;
	            }
	        } 
			else{
			    FLAG = 1;
			} 
		}
		if(FLAG != 0){
			cnt+=min;
	        a[tmp] = 0;
	        min = MAX;
		}  		    
	}	
}

2.最少修建多长的公路能把所有村庄连起来(二)

描述:一个地区有n个村庄,有一些村子之间可以修路,已知每条路的长度,问最少修建多长的公路可以把所有的村子连接起来。

输入:先输入一个正整数n(n小于500),表示有n个村庄,接下来n行每行n个正整数,其中第i行第j列的元素表示第i个村庄到第j个村庄之间的距离。

输出:输出路的总长度的最小值。

输入样例

3
0 1 5
1 0 2
5 2 0

输出样例

3

#include<iostream>
#define MAX 100000
using namespace std;

void search();

int arr[502][502];
bool flag[502];
int n;
int cnt = 0;

int main(){
    int i, j;
	cin >> n;
	for(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
		    cin >> arr[i][j];
		}
		flag[i] = true;
	}
	flag[0] = false;
	search();
	cout << cnt <<endl; 
}

void search(){
	int FLAG = 1;
	int min, tmp;
	while(FLAG){
	    FLAG = 0;
		min = MAX;
		for(int i = 0; i < n; i++){
			if(flag[i]){
			     FLAG = 1;
			}
			else{
				for(int j = 0; j < n; j++){
					if(i != j && arr[i][j] < min && flag[j]){
					    min = arr[i][j];
						tmp = j;
					}
				}
			}
		}
		if(FLAG == 1){
		    flag[tmp] = false;
			cnt += min;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/chengchencheng/article/details/82878583