标签:
Time Limit: 1000MS | Memory Limit: 30000K | |||
Total Submissions: 14021 | Accepted: 5484 | Special Judge |
Description
Input
Output
Sample Input
4 6 1 2 1 1 3 1 1 4 2 2 3 1 3 4 1 2 4 1
Sample Output
1 4 1 2 1 3 2 3 3 4
题目分析:北大poj的原题目样例有问题,Sample Output是错的。开始我也不知道那个样例的输出是怎样出来的!
毕竟4个节点只需要3条边就可以全部连接了,而样例的却是4条。网上看了一下别人的博客才知道阳历是错的。并且
输出的生成树的边的方案不唯一。我的输出结果是这样的:
Accepted的代码如下:(第一次Runtime Error了, 结构体数组开小了,注意:边数最多是:15000条,而点数是:1000个)
#include <stdio.h> #include <string.h> #include <iostream> #include <string> #include <algorithm> using namespace std; //模板的Kruskal算法 struct node { int u; int v; int w; bool operator <(const node &x)const { return w<x.w; } }q[15002]; int e; int fa[1002]; int dd[1002][2], k=0; int findset(int x) { return fa[x]!=x?fa[x]=findset(fa[x]):x; } int main() { int n, m; scanf("%d %d", &n, &m); int i, j; e=0; for(i=0; i<m; i++ ) { scanf("%d %d %d", &q[e].u, &q[e].v, &q[e].w ); e++; } sort(q+0, q+e ); // for(i=0; i<=n; i++) { fa[i]=i; } int cnt=0; //边数计数器 int mm; //save the max path weight for(j=0; j<e; j++) { if(findset(q[j].u) != findset(q[j].v) ) { fa[ fa[q[j].u] ] = fa[q[j].v]; dd[k][0]=q[j].u; dd[k][1]=q[j].v; k++; cnt++; if(cnt==n-1) { mm=q[j].w; break; } } } printf("%d\n%d\n", mm, cnt ); for(i=0; i<k; i++) { printf("%d %d\n", dd[i][0], dd[i][1] ); } return 0; }
POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)
标签:
原文地址:http://www.cnblogs.com/yspworld/p/4241081.html