测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
对每个测试用例,在1行里输出最小的公路总长度。
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
3 5
#include <iostream> #include <vector> using namespace std; #define INF 0x7fffffff int N; vector<vector<int> > val; int prim(){ vector<int>minV(N+1,INF); vector<bool>vis(N+1,false); int res=0; minV[1]=0; for(int i=1;i<=N;i++) { int j,k; for(k=-1,j=1;j<=N;j++) if(!vis[j]&&(k==-1||minV[j]<minV[k])) k=j; vis[k]=1; res+=minV[k]; for(int i=1;i<=N;i++) if(!vis[i]&&val[k][i]<minV[i]) minV[i]=val[k][i]; } return res; } int main() { //freopen("C:\\in.txt","r",stdin); while(cin>>N&&N){ val.assign(N+1,vector<int>(N+1,INF)); for(int i=1;i<=N*(N-1)/2;i++){ int a,b,d; cin>>a>>b>>d; val[a][b]=val[b][a]=d; } cout<<prim()<<endl; } return 0; } /************************************************************** Problem: 1017 User: starcuan Language: C++ Result: Accepted Time:30 ms Memory:1520 kb ****************************************************************/
原文:http://blog.csdn.net/starcuan/article/details/19305867