您的位置:首页 > 其它

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

2018-03-14 19:38 489 查看
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 

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;

//}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小生成树
相关文章推荐