7-10 公路村村通 (30 分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数$N$(≤1000)和候选道路数目$M$(≤3$N$);随后的$M$行对应$M$条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到$N$编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。
输入样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 6 15 1 2 5 1 3 3 1 4 7 1 5 4 1 6 2 2 3 4 2 4 6 2 5 2 2 6 6 3 4 6 3 5 1 3 6 1 4 5 10 4 6 8 5 6 3
|
输出样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include<stdio.h> #include<stdlib.h>
#define MAXVEX 1003 #define INFINITY 65535
void CreateGraph( ); int Prim();
int G[MAXVEX][MAXVEX],Nv,Ne;
int main() { int f = 0;
scanf("%d %d",&Nv,&Ne); CreateGraph(); f =Prim(); printf("%d",f);
return 0; }
void CreateGraph() { int i,j; int v1,v2,w;
for( i=1; i<=Nv; i++) { for( j=1; j<=Nv; j++) { G[i][j] = INFINITY; } }
for( i=0; i<Ne; i++) { scanf("%d %d %d",&v1,&v2,&w); G[v1][v2] = w; G[v2][v1]= G[v1][v2]; } }
int Prim() { int min; int i,j,k; int lowcost[MAXVEX]; int cost =0;
lowcost[1] = 0;
for( i=2; i<=Nv; i++) { lowcost[i] = G[1][i]; }
for( i=2; i<=Nv; i++) { min = INFINITY; j = 1; k = 0; while( j<=Nv ) { if( lowcost[j]!=0 && lowcost[j]<min) { min = lowcost[j]; k = j; } j++; }
if(k==0) { return -1; } cost += min; lowcost[k] = 0;
for( j=2; j<=Nv; j++) { if( lowcost[j]!=0 && G[k][j]<lowcost[j]) { lowcost[j] = G[k][j]; } }
}
return cost; }
|