还是畅通工程(克鲁斯卡尔算法)

来源:互联网 发布:下载淘宝网到电脑桌面 编辑:程序博客网 时间:2024/04/30 11:33


Problem Link:点击打开链接


题目描述

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 
输入描述:
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。    当N为0时,输入结束,该用例不被处理。


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

输入例子:
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50

输出例子:
35

AC code:

#include<iostream>#include<algorithm>#include<stdio.h>#include<map>#include<math.h>#include<string.h>#include<queue>#include<vector>#include<set>#define LL long long#define exp 1e-9#define MAXN 1000010        using namespace std;struct Road{int u,v;int cost;}road[5010];bool cmp(Road a,Road b){return a.cost<b.cost;}int N,M,sum,cnt;int fa[111];void init(){int i;for(i=1;i<=N;i++){fa[i]=i;}}int fin(int r){int tmp,son;son=r;while(r!=fa[r])r=fa[r];while(r!=tmp){tmp=fa[son];fa[son]=r;son=tmp;}return r;}bool join(int r1,int r2){int x,y;x=fin(r1);y=fin(r2);if(x!=y){if(x>y){fa[x]=y;}else{fa[y]=x;}return true;}return false;}void Kruscal(){int i;sum=0;sort(road+1,road+cnt+1,cmp);for(i=1;i<=cnt;i++){if(join(road[i].u,road[i].v)){sum+=road[i].cost;}}}int main( )  {  //freopen("D:\\in.txt","r",stdin); int i,u,v,cost,state;while(scanf("%d",&N)!=EOF)    {    if(N==0) break;    M=N*(N-1)/2;    init();    cnt=0;    for(i=1;i<=M;i++)    {    scanf("%d%d%d",&u,&v,&cost);road[++cnt].u=u;road[cnt].v=v;road[cnt].cost=cost;}Kruscal();printf("%d\n",sum);}  return 0;  }  



0 0