题意 就是求最小生成树中最大的那条边,题目看了n 久才看懂。
直接采用的是kruscal 算法,并查集+快排。
原先以为会好难~~ 其实并查集用一句话就搞定了,快排结构体 简单爆了
post code:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct edge{
int x,y,w;
}a[20000];
int fa[3000];
int n,m;
int cmp(edge a,edge b){ //quick sort from small to big
return a.w<b.w;
}
int Find(int i){ // disjoint set to distinguish different node
if(i==fa[i])return i;
fa[i]=Find(fa[i]);
return fa[i];
}
int kruscal(){ // pattern of kruscal
int fax,fay,max=-1;
for(int i=1;i<=m;i++){
fax=Find(a[i].x);
fay=Find(a[i].y);
if(fax!=fay){
if(max<a[i].w)max=a[i].w;
fa[fax]=fay;
}
}
return max;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
int ans;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
sort(a+1,a+1+m,cmp);
ans=kruscal();
printf("%d\n",ans);
}
return 0;
}
/*
4 6
1 2 23
2 3 1000
1 3 43
1 4 60
1 4 70
3 4 50
*/


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



