题目1024:畅通工程
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1639
解决:522
-
题目描述:
-
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
-
输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
-
输出:
-
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
-
样例输入:
-
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
-
样例输出:
-
3 ?
太依赖自己脑中对以前记过的Prim算法印象去写 没怎么思考搞了半天 改到应该差不多了还是过不了 郁闷啊#include"iostream" #include"string.h" using namespace std; int min=9999999; int i,j,n,m,ans=0,coco; int point[100][100]; int a[100]; int visited[100]; int prim(int m) { int pos=1; visited[1]=1; for(i=2;i<=m;i++) { a[i]=point[pos][i]; } for(i=1;i<=m;i++) { min=9999999; for(j=1;j<=m;j++) { if(a[j]<=min&&visited[j]==0) { min=a[j]; coco=j; } } if(pos!=coco) { ans+=min; pos=coco; visited[pos]=1; } for(j=1;j<=m;j++) { if(a[j]>point[pos][j]&&visited[j]==0) a[j]=point[pos][j]; } } return ans; } void main() { int m,n; int a,b; int d; while(cin>>n) { cin>>m; if(n==0) break; for(i=1;i<=100;i++) { for(j=1;j<=100;j++) { point[i][j]=9999999; } } memset(visited,0,sizeof(visited)); for(i=0;i<n;i++) { cin>>a>>b; cin>>point[a][b]; point[b][a]=point[a][b]; } d=prim(m); if(d>=9999999) printf("?\n"); else printf("%d\n",d); } }