最小生成树-还是畅通工程 (Kruskal和Prim算法)

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。  
Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。  
当N为0时,输入结束,该用例不被处理。  
Output对每个测试用例,在1行里输出最小的公路总长度。  
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3
5
 
 
Kruskal算法
 
 
//#include<stdio.h>
//#include<algorithm>
//using namespace std;
//int n;int pre[5050];
//void init()
//{
//    for(int i=1;i<=n;i++)
//    {
//        pre[i]=i;
//    }
//}
//int Find(int x)
//{
//    int r=x;
//    while(pre[r]!=r)
//    {
//        r=pre[r];
//    }
//    int i=x,j;
//    while(pre[i]!=r)
//    {
//        j=pre[i];
//        pre[i]=r;
//        i=j;
//    }
//    return r;
//}
//int mix(int x,int y)
//{
//    int fx=Find(x);
//    int fy=Find(y);
//    if(fx!=fy)
//    {
//        pre[fy]=fx;
//        return 1;
//    }
//    return 0;
//}
//struct node
//{
//    int u;
//    int v;
//    int w;
//}mapp[5050];
//bool cmp(node x,node y)
//{
//    return x.w<y.w;
//}
//
//int main()
//{
//    while(scanf("%d",&n)!=EOF)
//    {
//        int sum=0;
//        int ant=0;
//        if(n==0)
//            return 0;
//        int m=n*(n-1)/2;
//        for(int i=1;i<=m;i++)
//        {
//            scanf("%d%d%d",&mapp[i].u,&mapp[i].v,&mapp[i].w);
//        }
//        init();
//        sort(mapp+1,mapp+m+1,cmp);
//        for(int i=1;i<=m;i++)
//        {
//            if(mix(mapp[i].u,mapp[i].v))
//            {
//                ant++;
//                sum+=mapp[i].w;
//            }
//            if(ant==n-1)
//                break;
//        }
//        printf("%d\n",sum);
//    }
//    return 0;
//}
//最小生成树_Prime算法
//#include<stdio.h>
//#include<string.h>
//#include<algorithm>
//#define inf 0x3f3f3f3f
//using namespace std;
//int n,minn;
//int mapp[120][120],dis[120],vis[120];
//int ant,sum;
//void prime()
//{
//    vis[1]=1;
//    ant++;
//    int k;
//    while(ant<n)
//    {
//        minn=inf;
//        for(int i=1;i<=n;i++)//找到dis里面的最小的
//        {
//            if(!vis[i]&&dis[i]<minn)
//            {
//                minn=dis[i];
//                k=i;
//            }
//        }
//        vis[k]=1;
//        ant++;
//        sum+=dis[k];
//        for(int j=1;j<=n;j++)
//        {
//            if(!vis[j]&&dis[j]>mapp[k][j])//更新生成树到非树顶点的距离
//                dis[j]=mapp[k][j];
//        }
//    }
//}
//int main()
//{
//    while(scanf("%d",&n)!=EOF)
//    {
//        ant=0;
//        sum=0;
//        memset(vis,0,sizeof(vis));
//        int t1,t2,t3;
//        if(n==0)return 0;
//        int m=n*(n-1)/2;
//        for(int i=1;i<=n;i++)
//        {
//            for(int j=1;j<=n;j++)
//            {
//                if(i==j)
//                    mapp[i][j]=0;
//                else
//                    mapp[i][j]=inf;//建图
//            }
//        }
//        for(int i=1;i<=m;i++)
//        {
//            scanf("%d%d%d",&t1,&t2,&t3);
//            mapp[t1][t2]=t3;
//            mapp[t2][t1]=t3;//存储无向图
//        }
//        for(int i=1;i<=n;i++)
//        {
//            dis[i]=mapp[1][i];
//        }
//        prime();
//        printf("%d\n",sum);
//    }
//    return 0;
//}

猜你喜欢

转载自blog.csdn.net/kuguotao/article/details/79559184