kruskal_并查集_代码模板_hdu1232
kruskal代码模板
input
a b
v1 v2 w1
v2 v3 w2
...
a_the number of verteices
b_the number of edges
v1_verteices
wi_the weight of each edge
1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<cmath> 7 #include<ctype.h> 8 #include<algorithm> 9 #include<map> 10 #include<vector> 11 #include<set> 12 13 #define MAX 100005 14 #define MOD 1000003 15 #define inf 100000000 16 #define eps 1e-9 17 #define pi acos(-1.0) 18 #define LL long long 19 #define I64 __int64 20 #define max(a, b) ((a) > (b) ? (a) : (b)) 21 #define min(a, b) ((a) < (b) ? (a) : (b)) 22 23 using namespace std; 24 25 struct edge { 26 int v1, v2, w; 27 }; 28 29 int edge_num, vertex_num; 30 edge volume_e[30]; 31 int father[30]; 32 33 int cmp(edge a, edge b) { 34 return a.w < b.w; 35 } 36 37 int find(int x) { 38 int root = x; 39 if(father[root] != root) 40 root = father[root]; 41 return root; 42 } 43 44 int judge(edge e) { 45 if(find(e.v1) != find(e.v2)) 46 return 1; 47 return 0; 48 49 } 50 int main() 51 { 52 freopen("in.txt", "r", stdin); 53 cin >> edge_num >> vertex_num;// the number of edge and vertex 54 // v1, v2, weight 55 for(int i = 0; i < edge_num; i++) 56 scanf("%d %d %d", &volume_e[i].v1, &volume_e[i].v2, &volume_e[i].w); 57 58 // initial 59 for(int i = 1; i <= vertex_num; i++) father[i] = i; 60 61 sort(volume_e, volume_e+edge_num, cmp); 62 63 int sum = 0; 64 for (int i = 0;i < edge_num;i ++) 65 { 66 int x = find (volume_e[i].v1); 67 int y = find (volume_e[i].v2); 68 if (x != y) 69 { 70 sum += volume_e[i].w; 71 father[x] = y; 72 } 73 } 74 printf ("%d\n", sum); 75 } 76 77 /* 78 5 5 79 1 2 2 80 2 3 3 81 1 4 1 82 3 4 2 83 4 5 4 84 85 */
hdu1232
1 using namespace std; 2 3 int add; 4 int f[100010]; 5 int n, m; 6 7 int findset(int x) 8 { 9 int set = x; 10 while(f[set] != set) 11 { 12 set = f[set]; 13 } 14 return set; 15 } 16 17 void merge(int a, int b) 18 { 19 int x = findset(a); 20 int y = findset(b); 21 if(x != y) 22 f[x] = y; 23 } 24 25 int main() 26 { 27 freopen("in.txt", "r", stdin); 28 while(scanf("%d %d", &n, &m) == 2) 29 { 30 add = 0; 31 if(n == 0) 32 break; 33 else if(m == 0) 34 { 35 add = n - 1; 36 printf("%d\n", add); 37 } 38 else 39 { 40 for(int i = 1; i <= n; i++) f[i] = i; 41 42 for(int i = 0; i < m; i++) 43 { 44 int a, b; 45 scanf("%d %d", &a, &b); 46 merge(a, b); 47 } 48 49 for(int i = 1; i <= n; i++) 50 if(f[i] == i) 51 add++; 52 add--; 53 printf("%d\n", add); 54 } 55 // 56 memset(f, 0, sizeof(f)); 57 } 58 } 59 60 /* 61 4 2 62 1 3 63 4 3 64 3 3 65 1 2 66 1 3 67 2 3 68 5 2 69 1 2 70 3 5 71 999 0 72 0 73 74 */