HDOJ P1233 还是畅通工程

来源:互联网 发布:手机smali转换java 编辑:程序博客网 时间:2024/04/28 22:50

还是畅通工程

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


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.
 

Source
浙大计算机研究生复试上机考试-2006年
 

Recommend
JGShining

最简单的最小生成树。可以用普里姆算法或克鲁斯卡尔算法解决。

一年多没碰图论算法了,今天凭回忆一次AC,还好。算是恢复练习吧。

题目说不让用cin。经测试cin不会TLE。


代码略乱,见谅

#include <iostream>using namespace std;int a[110][110],b[110],c[110],n,i,j,j1,k,l;int main(int argc, char *argv[]){std::ios::sync_with_stdio(false);cin>>n;while(n!=0){memset(a,0,sizeof(a));memset(c,0,sizeof(c));for(l=1;l<=(n*(n-1)/2);++l){cin>>i>>j>>k;a[i][j]=k; a[j][i]=k;}for(i=1;i<=n;++i) b[i]=a[1][i];l=n-1; k=0; c[1]=1;while(l>0){j=-1;for(i=2;i<=n;++i)if((!c[i])&&((j<0)||(j>b[i]))){j=b[i]; j1=i;}k+=j; c[j1]=1;for(i=1;i<=n;++i) b[i]=a[j1][i]<b[i]?a[j1][i]:b[i];  --l;}cout<<k<<endl;cin>>n;}return 0;}

kdwycz的网站:  http://kdwycz.com/

kdwyz的刷题空间:http://blog.csdn.net/kdwycz


原创粉丝点击