poj 1861 Network (kruskal 最小生成树)
来源:互联网 发布:淘宝企业开店收费 编辑:程序博客网 时间:2024/05/01 23:43
#include<stdio.h>#include<string.h>#include<stdlib.h>const int maxn = 15005;int n , m , fa[maxn] , rank[maxn];struct T{ int u , v , c;}edge[maxn * 2] , edge1[maxn * 2];void init(){ for(int i = 1 ; i <= n ; i ++){ fa[i] = i; rank[i] = 0; }}int cmp( const void *a , const void *b ){ struct T *cc = (T *)a; struct T *dd = (T *)b; if(cc->c != dd->c) return cc->c - dd->c; else return dd->u - cc->u;}int find_set(int x){ if(fa[x] != x){ fa[x] = find_set(fa[x]); } return fa[x];}bool Union(int x , int y){ x = find_set(x); y = find_set(y); if(x == y) return false; if(rank[x] > rank[y]){ fa[y] = x; } else{ if(rank[y] == rank[x]){ rank[y] ++; } fa[x] = y; } return true;}void kruskal(){ int k = 0; int max = 0; for(int i = 0 ; i < m ; i ++){ if(Union(edge[i].u , edge[i].v)) { edge1[k ++] = edge[i]; if(max < edge[i].c) max = edge[i].c; } } printf("%d\n", max); printf("%d\n", k); for (int i = 0; i < k; i++){ printf("%d %d\n", edge1[i].u, edge1[i].v); }}int main(){ while(~scanf("%d%d" , &n , &m)){ init(); for(int i = 0 ; i < m ; i ++){ scanf("%d%d%d" , &edge[i].u , &edge[i].v , &edge[i].c); } qsort(edge , m , sizeof(edge[0]) , cmp); kruskal(); } return 0;}