HDU 还是畅通工程 -- 最小生成树prim

来源:互联网 发布:数据科学师的工作内容 编辑:程序博客网 时间:2024/06/07 10:06

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 37791    Accepted Submission(s): 17024


Problem 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
#include <stdio.h>#include <string.h>#include <algorithm>#define inf 0x3f3f3f3fusing namespace std;const int N = 1005;int map[N][N];int vis[N];int low[N];int m,n;int prim(){int i,j;memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){if(i==1) low[i]=0;else low[i]=map[1][i];}vis[1]=1;int ans=0;for(i=2;i<=n;i++){int m=inf,t;for(j=1;j<=n;j++){if(!vis[j]&&low[j]<m){t=j;m=low[j];}}vis[t]=1;ans=ans+m;for(j=1;j<=n;j++){if(!vis[j]&&low[j]>map[t][j])low[j]=map[t][j];}}return ans;}int main(){int i,j;while(~scanf("%d",&n)){if(n==0)break;memset(map,inf,sizeof(map));for(i=1;i<=n*(n-1)/2;i++){int x,y,z;scanf("%d %d %d",&x,&y,&z);map[x][y]=min(map[x][y],z);map[y][x]=min(map[y][x],z);}printf("%d\n",prim());}return 0;}

0 0
原创粉丝点击