ACM PKU 1251 Jungle Roads http://poj.org/problem?id=1251

最小生成树水题,用prim ,注意一下图书无向图;

 1 #include <iostream>
2 #include <string.h>
3 #include <stdio.h>
4 using namespace std;
5
6 const int maxn=27;
7
8 const int inf=0x7fffffff;
9
10 int village;
11
12 int lowcost[maxn],adjvex[maxn];
13
14 int G[maxn][maxn];
15
16 int MinEdge()
17 {
18 int index = 0,temp=inf;
19 for(int i=0; i<village; i++)
20 {
21 if(lowcost[i]!=-1&&lowcost[i]<temp)
22 {
23 temp=lowcost[i];
24 index=i;
25 }
26 }
27 //cout<<index<<endl;
28 return index;
29 }
30
31 int prim()
32 {
33 int i,j,k;
34 int sum=0;
35 for (i = 1; i < village; i++) //初始化两个辅助数组;
36 {
37 lowcost[i] = G[0][i];
38 adjvex[i] = 0;
39 }
40 lowcost[0] = -1; //将顶点0加入集合U中;
41 for (i = 1; i < village; i++)
42 {
43 k = MinEdge(); //在lowcost中寻找最短边的顶点;
44 sum += lowcost[k];
45 lowcost[k] = -1;
46 for (j = 1; j < village; j++)
47 if (G[k][j]<lowcost[j]&&lowcost[j]!=-1)
48 {
49 lowcost[j] = G[k][j];
50 adjvex[j] = k;
51 }
52 }
53 return sum;
54 }
55
56 int main()
57 {
58 //freopen("in.txt","r",stdin);
59 while(scanf("%d",&village)&&village!=0)
60 {
61 memset(G,127,sizeof(G));
62 for(int j=1; j<village; j++)
63 {
64 char ch;
65 int num;
66 cin>>ch>>num;
67 int start=ch-'A';
68 for(int i=0; i<num; i++)
69 {
70 char c;
71 int weight;
72 cin>>c>>weight;
73 int end = c-'A';
74 G[start][end]=weight;
75 G[end][start]=weight;
76 }
77 }
78 int mincost=prim();
79 printf("%d\n",mincost);
80 }
81 return 0;
82 }

  

posted on 2011-08-11 16:52  _Clarence  阅读(213)  评论(0编辑  收藏  举报

导航