#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cstdio>
#include <map>
using namespace std;
const int MAXN = 1001;
const int MAXM = 15001;
struct edge
{
int u,v,w;
}edges[MAXM];
int cmp(const void *a,const void *b) //按长度排序
{
edge aa = *(const edge *)a;
edge bb = *(const edge *)b;
return aa.w - bb.w;
}
int parent[MAXN];
int Rank[MAXN];
int N,M;
int ans[MAXN],ai;
int num,maxedge;
void Make_Set()
{
for(int i = 1; i <= N; i++)
{
parent[i] = i;
Rank[i] = 1;
}
}
int Find(int x)
{
while(x != parent[x])
x = parent[x];
return x;
}
void Union(int x,int y)
{
x = Find(x);
y = Find(y);
if(x == y)
return;
if(Rank[x] > Rank[y])
{
parent[y] = x;
Rank[x] += Rank[y];
}
else
{
parent[x] = y;
Rank[y] += Rank[x];
}
}
void Kruskal()
{
ai = 0;
num = 0;
int u,v;
Make_Set();
for(int i = 1; i <= M; i++)
{
u = edges[i].u;
v = edges[i].v;
if(Find(u) != Find(v))//如果不形成回路
{
ans[ai] = i;
ai++;
if(edges[i].w > maxedge)
maxedge = edges[i].w;
num++;
Union(u,v); //合并
}
if(num >= N - 1)
break;
}
}
int main()
{
while(cin>>N>>M)
{
for(int i = 1; i <= M; i++)
{
cin>>edges[i].u>>edges[i].v>>edges[i].w;
}
qsort(edges + 1,M,sizeof(edges[0]),cmp);
maxedge = 0;
num = 0;
Kruskal();
cout<<maxedge<<endl;
cout<<num<<endl;
for(int i = 0; i < num; i++)
{
cout<<edges[ans[i]].u<<" "<<edges[ans[i]].v<<endl;
}
}
return 0;
}
poj 1861 kruskal
最新推荐文章于 2020-06-11 20:29:16 发布
本文详细介绍了Kruskal算法在寻找无向图的最小生成树过程中的应用,通过实例展示了如何使用该算法解决实际问题。

147

被折叠的 条评论
为什么被折叠?



