还是畅通工程

来源:互联网 发布:smartgit linux 破解 编辑:程序博客网 时间:2024/05/20 18:02
roblem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
 

Output
对每个测试用例,在1行里输出最小的公路总长度。
 

Sample Input
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
 

Sample Output
35
Hint
Hint
Huge input, scanf is recommended.


普利姆+堆优化:

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;struct Node{int to;int dis;Node(int a,int b){to = a;dis = b;}bool operator< (Node t) const{return dis > t.dis;}};int map[103][103];bool visited[103]; int ans;void prim(int n,int x){memset(visited,false,sizeof(visited));priority_queue<Node> q;q.push(Node(1,0));int cnt = 0;ans = 0;while(!q.empty()){Node t = q.top();q.pop();if(visited[t.to]){continue;}visited[t.to] = true;ans += t.dis;cnt++;for(int i = 1;i <= n;i++){if(!visited[i]){q.push(Node(i,map[t.to][i]));}}if(cnt == n){break;}}}int main(){int n;while(scanf("%d",&n) && n != 0){for(int i = 0;i < n * (n - 1) / 2;i++){int u,v,d;scanf("%d%d%d",&u,&v,&d);map[u][v] = map[v][u] = d;}prim(n,1);printf("%d\n",ans);}return 0;}

克鲁斯克尔:

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;struct Node{int from;int to;int dis;Node(){}Node(int a,int b,int c){from = a;to = b;dis = c;}bool operator< (Node t) const{return dis < t.dis;}};Node e[20000];int pre[103]; int ans;int find(int x){return x == pre[x] ? x : pre[x] = find(pre[x]);}void kruskal(int n){sort(e,e + n * (n - 1) / 2);for(int i = 1;i <= n;i++){pre[i] = i;}int cnt = 0;ans = 0;int k = 0;while(cnt < n - 1){for(int i = k;i < n * (n - 1) / 2;i++){int x = find(e[i].from);int y = find(e[i].to);if(x != y){ans += e[i].dis;pre[x] = y;cnt++;k = i + 1;break;}}}}int main(){int n;while(scanf("%d",&n) && n != 0){for(int i = 0;i < n * (n - 1) / 2;i++){int u,v,d;scanf("%d%d%d",&u,&v,&d);e[i] = Node(u,v,d);}kruskal(n);printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击