http://poj.org/problem?id=2395
此题题意为求解最小生成树的最大边
1
#include
<
stdio.h
>
2 #include < algorithm >
3 using namespace std;
4 #define max(a,b) a>b?a:b
5 struct line
6 {
7 int begin;
8 int end;
9 int lenth;
10 };
11 line * amount;
12 int * father;
13 int numofnode,numofline;
14 int i,j,a,b,c;
15 int find( int k)
16 {
17 return father[k] == k ? k:father[k] = find(father[k]);
18 }
19 int cmp(line a,line b)
20 {
21 return a.lenth < b.lenth ? 1 : 0 ;
22 }
23 void ini()
24 {
25 scanf( " %d %d " , & numofnode, & numofline);
26 amount = new line [numofline];
27 father = new int [numofnode + 1 ];
28 for (i = 1 ;i <= numofnode;i ++ ) father[i] = i;
29 for (i = 0 ;i < numofline;i ++ )
30 {
31 scanf( " %d %d %d " , & a, & b, & c);
32 amount[i].begin = a;
33 amount[i].end = b;
34 amount[i].lenth = c;
35 }
36 sort(amount,amount + numofline,cmp);
37 }
38 int kruskal()
39 {
40 int maxlinelen = 0 ;
41 for (i = 0 ;i < numofline;i ++ )
42 {
43 a = find(amount[i].begin),b = find(amount[i].end);
44 if (a != b)
45 {
46 maxlinelen = max(maxlinelen,amount[i].lenth);
47 father[a] = b;
48 }
49 }
50 return maxlinelen;
51 }
52 int main()
53 {
54 ini();
55 printf( " %d\n " ,kruskal());
56 return 0 ;
57 }
2 #include < algorithm >
3 using namespace std;
4 #define max(a,b) a>b?a:b
5 struct line
6 {
7 int begin;
8 int end;
9 int lenth;
10 };
11 line * amount;
12 int * father;
13 int numofnode,numofline;
14 int i,j,a,b,c;
15 int find( int k)
16 {
17 return father[k] == k ? k:father[k] = find(father[k]);
18 }
19 int cmp(line a,line b)
20 {
21 return a.lenth < b.lenth ? 1 : 0 ;
22 }
23 void ini()
24 {
25 scanf( " %d %d " , & numofnode, & numofline);
26 amount = new line [numofline];
27 father = new int [numofnode + 1 ];
28 for (i = 1 ;i <= numofnode;i ++ ) father[i] = i;
29 for (i = 0 ;i < numofline;i ++ )
30 {
31 scanf( " %d %d %d " , & a, & b, & c);
32 amount[i].begin = a;
33 amount[i].end = b;
34 amount[i].lenth = c;
35 }
36 sort(amount,amount + numofline,cmp);
37 }
38 int kruskal()
39 {
40 int maxlinelen = 0 ;
41 for (i = 0 ;i < numofline;i ++ )
42 {
43 a = find(amount[i].begin),b = find(amount[i].end);
44 if (a != b)
45 {
46 maxlinelen = max(maxlinelen,amount[i].lenth);
47 father[a] = b;
48 }
49 }
50 return maxlinelen;
51 }
52 int main()
53 {
54 ini();
55 printf( " %d\n " ,kruskal());
56 return 0 ;
57 }