标签:poj
| 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)
标签:poj
原文地址:http://blog.csdn.net/u013487051/article/details/38047827