湖南修路(最小生成树prim)
description |
现得到乡村道路统计表,表中列出了任意两村间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全部畅通需要的最低成本。 |
input |
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。 |
output |
每个测试用例的输出占一行,输出全部畅通需要的最低成本。 |
sample_input |
4 1 3 2 0 1 4 3 0 2 3 5 1 2 4 6 1 3 4 5 0 1 2 4 0 3 1 2 1 0 1 3 2 1 2 3 4 1 |
sample_output |
#include<iostream> #include<cstdio> #include<string.h> #define MAX 999999; using namespace std; int map[105][105],dist[105]; bool isvisited[105]; int prim(int n) { int i,j,pos; int min,sum; sum=0; memset(isvisited,false,sizeof(isvisited)); //初始化 for(i=1; i<=n; i++) { dist[i]=map[1][i]; } //从1开始 isvisited[1]=true; dist[1]=MAX; //找到权值最小点并记录下位置 for(i=1; i<n; i++) { min=MAX; //pos=-1; for(j=1; j<=n; j++) { if(!isvisited[j] && dist[j]<min) { min=dist[j]; pos=j; } } /* if(min==MAX) { return -1; }*/ sum+=min; isvisited[pos]=true; //更新权值 for(j=1; j<=n; j++) { if(!isvisited[j] && dist[j]>map[pos][j]) { dist[j]=map[pos][j]; } } } return sum; } int main() { int n,a,b; int c,d; while(~scanf("%d",&n)) { if(n==0) break; for(int i=0; i<(n*(n-1)/2); i++) { cin >> a>> b>>c>>d; if(d==1) map[a][b]=map[b][a]=0;//把已经修好的用零代替,这样既能不耽误最小树的寻找,又加不上其“代价” else map[a][b]=map[b][a]=c; } int ans=prim(n); printf("%d\n",ans); } return 0; } |
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~