PKU 2395 Out Of Hay

题目大意就不说了,方法是利用Kuskral算法(最小生成树算法)。

因为要遍历全图,所以总存在一个生成树,所以我们利用Kuskral算法找到最后一条边---也就是最长的边。

#include <iostream>
#include
<cstdio>
#include
<functional>
#include
<set>
#include
<algorithm>
using namespace std;
#define MAXV 2009
#define INF 1000000090
struct Edge{
int u,v;
long long w;
bool operator < (const Edge &elem)const{
return w < elem.w;
}
}edge[
10009];
struct Tree{
int parent;
int rank;
}t[MAXV];
void Make_Set(int n){
for (int i = 0; i <= n; ++i) {
t[i].parent
=i;
t[i].rank
=0;
}
}
int Find_Set(int x){
int i,j,r;
r
=x;
while(t[r].parent != r){
r
=t[r].parent;
}
i
=x;
while(t[i].parent != r){
j
=t[i].parent;
t[i].parent
=r;
i
=j;
}
return r;
}
int Union_Set(int x,int y){
if(t[x].rank > t[y].rank){
t[y].parent
=x;
return x;
}
else{
t[x].parent
=y;
if(t[x].rank==t[y].rank)
t[y].rank
++;
return y;
}
}
int Kruskal(int N,int E){
int i,j,u,v;
long long w;
int s1,s2;

sort(edge,edge
+E);
Make_Set(N);
j
=0;i=0;
while(j < N-1){
u
=edge[i].u;
v
=edge[i].v;
w
=edge[i].w;
s1
=Find_Set(u);
s2
=Find_Set(v);
if(s1!=s2){
Union_Set(s1,s2);
++j;
}
++i;
}
return w;
}
int main() {
int N,E;
int i;
while(cin>>N>>E){
for(i=0;i<E;++i){
cin
>>edge[i].u>>edge[i].v>>edge[i].w;
}
cout
<<Kruskal(N,E)<<endl;
}
return 0;
}

  

转载于:https://www.cnblogs.com/Mathida/archive/2011/09/13/2174655.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值