poj1251
http://poj.org/problem?id=1251
此题一看就知是最小生成树,由于数据量很小,输入的数据形式也没有那一种比较方便,所以prim和kruskal都可以
下面给出kruskal代码
1 #include<stdio.h>
2 #include<iostream>
3 #include<algorithm>
4 using namespace std;
5 struct line
6 {
7 int begin;
8 int end;
9 int lenth;
10 };
11 line num[100];
12 int amount,sumofline;
13 int i,j;
14 int father[100];
15 int minlen;
16 int find(int k)
17 {
18 return father[k]==k?k:father[k]=find(father[k]);
19 }
20 int cmp(line a,line b)
21 {
22 return a.lenth<b.lenth?1:0;
23 }
24 void ini()
25 {
26 sumofline=0;
27 char start,tmpend;
28 int tmpline,tmplen;
29 int a,b;
30 for(i=0;i<amount;i++) father[i]=i;
31 for(i=0;i<amount-1;i++)
32 {
33 cin>>start;
34 scanf("%d",&tmpline);
35 a=start-'A';
36 for(j=0;j<tmpline;j++)
37 {
38 cin>>tmpend;
39 scanf("%d",&tmplen);
40 b=tmpend-'A';
41 num[sumofline].begin=a;
42 num[sumofline].end=b;
43 num[sumofline++].lenth=tmplen;
44 }
45 }
46 sort(num,num+sumofline,cmp);
47 }
48 int kruskal()
49 {
50 minlen=0;
51 int a,b;
52 for(i=0;i<sumofline;i++)
53 {
54 a=find(num[i].begin),b=find(num[i].end);
55 if(a!=b)
56 {
57 father[a]=b;
58 minlen+=num[i].lenth;
59 }
60 }
61 return minlen;
62 }
63 int main()
64 {
65 while(scanf("%d",&amount)==1&&amount)
66 {
67 ini();
68 printf("%d\n",kruskal());
69 }
70 return 0;
71 }