还是畅通工程

来源:互联网 发布:青苹果申报数据库 编辑:程序博客网 时间:2024/06/06 02:12

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


  prim代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int inf=0x3f3f;int map[101][101],dis[101],book[101];int main(){    int m;    while(cin>>m)    {        if(m==0) break;        memset(book,0,sizeof(book));        int n=m*(m-1)/2;        for(int i=1;i<=m;i++)        {            for(int j=1;j<=m;j++)            {                if(i==j) map[i][j]=0;                else map[i][j]=inf;            }        }        int a,b,c;        for(int i=1;i<=n;i++)        {            cin>>a>>b>>c;            map[a][b]=c;            map[b][a]=c;        }        for(int i=1;i<=m;i++)            dis[i]=map[1][i];        int cont=1,ans=0,u;        book[1]=1;        while(cont<m)        {            int minn=inf;            for(int i=1;i<=m;i++)            {                if(minn>dis[i]&&!book[i])                {                    minn=dis[i];                    u=i;                }            }            book[u]=1;            ans+=dis[u];            cont++;            for(int j=1;j<=m;j++)            {                if(!book[j]&&dis[j]>map[u][j])                    dis[j]=map[u][j];            }        }        cout<<ans<<endl;    }    return 0;}




原创粉丝点击