标签:oss cond orm enter require more help string bre
Time Limit: 1000MS | Memory Limit: 30000K | |||
Total Submissions: 13266 | Accepted: 5123 | 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
这题我就不吐槽了。
。
例子都是错的。。我没看讨论区。。
一直不知道。
。
浪费我那么多时间调试。
。
我去。
。
各种吐血。
。我也逗比。。
例子明显的出现环。。
正确的例子应该是:
1
3
1 2
1 3
3 4
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<cmath> using namespace std; const int maxn1 = 15050;//边数的最大值 const int maxn2 = 1050;//顶点个数的最大值 int f[maxn2];//f[i]为顶点i在集合对树中的根节点 int s[maxn1];//记录选择的边的序号 int n, m;//集线器的个数。 边的个数 int cnt;//选择的边的数目 int ans;//记录最大的长度 struct Edge { int u; int v; int len; }; Edge edge[maxn1];//边的数组 bool cmp(Edge a, Edge b)//按长度从小到大的排序 { return a.len<b.len; } void init()//初始化 { for(int i=0; i<=n; i++) f[i] = i; } int find(int x)//并查集的find函数 { return f[x] == x?x:f[x]=find( f[x] ); } void kruskal() { int x, y; cnt = 0; for(int i=1; i<=m; i++) { x = find( edge[i].u ); y = find( edge[i].v ); if( x==y ) continue; f[y] = x; ans = edge[i].len; cnt++; s[cnt] = i; if( cnt>=n-1 ) break; } } void output()//输出函数 { printf("%d\n", ans); printf("%d\n", cnt); for(int i=1; i<=cnt; i++) printf("%d %d\n", edge[ s[i] ].u, edge[ s[i] ].v); } int main() { while(scanf("%d%d", &n, &m)!=EOF) { init(); for(int i=1; i<=m; i++) scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].len); sort( edge+1, edge+m+1, cmp ); kruskal(); output(); } return 0; }
POJ 1861:Network(最小生成树&&kruskal)
标签:oss cond orm enter require more help string bre
原文地址:http://www.cnblogs.com/zsychanpin/p/6889090.html