【hdu 1233】 还是畅通工程

来源:互联网 发布:武神赵子龙辅助软件 编辑:程序博客网 时间:2024/06/06 12:39
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
Hint
Hint
Huge input, scanf is recommended.
 

这道题是一个简单的最小生成树,用prim或者kruskra可以解决,下面是程序:
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;const int N=105;int map[N][N],d[N],n;bool vis[N];int read(){char c=getchar();int s=0;while(c<'0'||c>'9'){c=getchar();}while(c>='0'&&c<='9'){s*=10;s+=c-'0';c=getchar();}return s;}int prim(){int i,j,s=0;memset(vis,0,sizeof(vis));vis[1]=1;for(i=2;i<=n;i++){d[i]=map[1][i];}for(i=2;i<=n;i++){int mn=0x7fffffff,mni;for(j=1;j<=n;j++){if(!vis[j]&&d[j]<mn){mn=d[j];mni=j;}}vis[mni]=1;s+=d[mni];for(j=1;j<=n;j++){if(!vis[j]&&map[mni][j]<d[j]){d[j]=map[mni][j];}}}return s;}int main(){int m,u,v,w;while(n=read()){memset(map,0x7f,sizeof(map));m=n*(n-1)/2;while(m--){u=read();v=read();w=read();map[v][u]=map[u][v]=min(map[u][v],w);}printf("%d\n",prim());}return 0;}

原创粉丝点击