poj 1861

来源:互联网 发布:java switch enum 编辑:程序博客网 时间:2024/04/26 11:46
#include <iostream>#include <cstring>#include <cmath>using namespace std;const int MAXN = 1010;const int MAXM = 15010;struct Edge{int u, v, w;};Edge edges[MAXM];int ans[MAXN];int parent[MAXN], kcount[MAXN];int n, m;int num;int MaxEdge;void UFset(){int i;for (i = 0; i < n; ++i){parent[i] = i;kcount[i] = 1;}}/**int Find_Parent(int x){if(x != parent[x])parent[x] = Find_Parent( parent[x] );return parent[x];}*/int Find_Parent(int x){int s;for (s = x; s != parent[s]; s = parent[s]);while(s != x){int tmp;tmp = parent[x];parent[x] = s;x = tmp;}return s;}void Union(int u, int v){int r1 = Find_Parent( u );int r2 = Find_Parent( v );if(kcount[r1] > kcount[r2]){parent[r2] = r1;kcount[r1] += kcount[r2];}else{parent[r1] = r2;kcount[r2] += kcount[r1];}}void Kruskal(){int u,v;int i;UFset();MaxEdge = 0;for( i=0; i<m; i++){u = edges[i].u;v = edges[i].v;if( Find_Parent(u) != Find_Parent(v) ){ans[num++] = i;if( edges[i].w > MaxEdge )MaxEdge = edges[i].w;Union( u, v );}if( num >= n-1 )            break;}}int cmp(const void* a, const void* b){Edge* aa = ( Edge* )a;Edge* bb = ( Edge* )b;if(aa->w > bb->w)return 1;elsereturn -1;}int main(){int i, u, v, w;while ( ~scanf("%d%d", &n, &m) ){for (i = 0; i < m; ++i){scanf("%d%d%d", &u, &v, &w);edges[i].u = u;edges[i].v = v;edges[i].w = w;}qsort(edges, m, sizeof(edges[0]), cmp);MaxEdge = 0;num = 0;Kruskal();printf("%d\n", MaxEdge);printf("%d\n", num);for(i = 0; i < num; ++i)printf("%d %d\n", edges[ ans[i] ].u, edges[ ans[i] ].v);}return 0;}
测试样例有错误!
原创粉丝点击