http://poj.org/problem?id=2075
此题求解最小生成树的权值,此题麻烦之处在于字符串的判断
1
#include
<
stdio.h
>
2 #include < string .h >
3 #include < algorithm >
4 using namespace std;
5 char ** name;
6 struct line
7 {
8 int begin;
9 int end;
10 float lenth;
11 };
12 line * amount;
13 float sumofcost;
14 int * father;
15 int numofname,numofline;
16 int i,j;
17 int cmp(line a,line b)
18 {
19 return a.lenth < b.lenth ? 1 : 0 ;
20 }
21 int find( int k)
22 {
23 return father[k] == k ? k:father[k] = find(father[k]);
24 }
25 void ini()
26 {
27 scanf( " %f " , & sumofcost);
28 scanf( " %d " , & numofname);
29 name = ( char ** )malloc(numofname * sizeof ( char * ));
30 father = new int [numofname];
31 for (i = 0 ;i < numofname;i ++ ) name[i] = ( char * )malloc( 30 * sizeof ( char )); // 此处都是本人耍帅,用指针动态分配内存,你可以理解为建立一个二维数组
32 for (i = 0 ;i < numofname;i ++ )
33 {
34 scanf( " %s " ,name[i]);
35 father[i] = i;
36 }
37 scanf( " %d " , & numofline);
38 amount = new line [numofline];
39 char tmpstr1[ 30 ],tmpstr2[ 30 ];
40 float tmplen;
41 int a,b,c;
42 for (i = 0 ;i < numofline;i ++ )
43 {
44 scanf( " %s %s %f " ,tmpstr1,tmpstr2, & tmplen);
45 c = 0 ;
46 for (j = 0 ;j < numofname;j ++ )
47 {
48 if ( ! strcmp(tmpstr1,name[j])) a = j,c ++ ;
49 if ( ! strcmp(tmpstr2,name[j])) b = j,c ++ ;
50 if (c >= 2 ) break ;
51 }
52 amount[i].begin = a;
53 amount[i].end = b;
54 amount[i].lenth = tmplen;
55 }
56 sort(amount,amount + numofline,cmp);
57 }
58 float kruskal()
59 {
60 float minlen = 0 ;
61 int a,b;
62 for (i = 0 ;i < numofline;i ++ )
63 {
64 a = find(amount[i].begin),b = find(amount[i].end);
65 if (a != b)
66 {
67 father[a] = b;
68 minlen += amount[i].lenth;
69 }
70 }
71 return minlen;
72 }
73 void pr()
74 {
75 float k = kruskal();
76 if (k <= sumofcost) printf( " Need %.1f miles of cable\n " ,k);
77 else printf( " Not enough cable \n " );
78 }
79 int main()
80 {
81 ini();
82 pr();
83 return 0 ;
84 }
2 #include < string .h >
3 #include < algorithm >
4 using namespace std;
5 char ** name;
6 struct line
7 {
8 int begin;
9 int end;
10 float lenth;
11 };
12 line * amount;
13 float sumofcost;
14 int * father;
15 int numofname,numofline;
16 int i,j;
17 int cmp(line a,line b)
18 {
19 return a.lenth < b.lenth ? 1 : 0 ;
20 }
21 int find( int k)
22 {
23 return father[k] == k ? k:father[k] = find(father[k]);
24 }
25 void ini()
26 {
27 scanf( " %f " , & sumofcost);
28 scanf( " %d " , & numofname);
29 name = ( char ** )malloc(numofname * sizeof ( char * ));
30 father = new int [numofname];
31 for (i = 0 ;i < numofname;i ++ ) name[i] = ( char * )malloc( 30 * sizeof ( char )); // 此处都是本人耍帅,用指针动态分配内存,你可以理解为建立一个二维数组
32 for (i = 0 ;i < numofname;i ++ )
33 {
34 scanf( " %s " ,name[i]);
35 father[i] = i;
36 }
37 scanf( " %d " , & numofline);
38 amount = new line [numofline];
39 char tmpstr1[ 30 ],tmpstr2[ 30 ];
40 float tmplen;
41 int a,b,c;
42 for (i = 0 ;i < numofline;i ++ )
43 {
44 scanf( " %s %s %f " ,tmpstr1,tmpstr2, & tmplen);
45 c = 0 ;
46 for (j = 0 ;j < numofname;j ++ )
47 {
48 if ( ! strcmp(tmpstr1,name[j])) a = j,c ++ ;
49 if ( ! strcmp(tmpstr2,name[j])) b = j,c ++ ;
50 if (c >= 2 ) break ;
51 }
52 amount[i].begin = a;
53 amount[i].end = b;
54 amount[i].lenth = tmplen;
55 }
56 sort(amount,amount + numofline,cmp);
57 }
58 float kruskal()
59 {
60 float minlen = 0 ;
61 int a,b;
62 for (i = 0 ;i < numofline;i ++ )
63 {
64 a = find(amount[i].begin),b = find(amount[i].end);
65 if (a != b)
66 {
67 father[a] = b;
68 minlen += amount[i].lenth;
69 }
70 }
71 return minlen;
72 }
73 void pr()
74 {
75 float k = kruskal();
76 if (k <= sumofcost) printf( " Need %.1f miles of cable\n " ,k);
77 else printf( " Not enough cable \n " );
78 }
79 int main()
80 {
81 ini();
82 pr();
83 return 0 ;
84 }