您的位置:首页 > 其它

Uva1395 最小生成树

2016-10-15 04:00 323 查看
//Uva1395

//Kruskal算法按边权排序之后,选前面边构成最小生成树,用n记录已经加入并查集的节点数,当为num时停止,

//比较是否连接的节点数等于节点总数,不等就-1,相等输出最小生成度

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<queue>

#include<cmath>

using namespace std;

const int maxn=10000;

struct Edge{

int l,r,w;

bool operator < (const Edge&rhs){

return w<rhs.w;

}

}edge[maxn];

int ufs[maxn];

int n,m,cnt;

int find(int u){

return ufs[u]==u? u:ufs[u]=find(ufs[u]);

}

int ans;

void Kruskal(){

sort(edge,edge+m);

int aa=m-n+2;//需要n-1垫底,但是以n-1的开头作为一个所以加一

for(int i=0;i<aa;i++){

for(int i=0;i<maxn;i++)ufs[i]=i;

cnt=1;

for(int j=i;j<m;j++){

int x=find(edge[j].l);

int y=find(edge[j].r);

if(x!=y){

ufs[x]=y;

cnt++;

if(cnt==n){

ans=min(ans,abs(edge[j].w-edge[i].w));

// printf("%d %d\n",edge[j].w,edge[i].w);

break;

}

}

}

}

}

int main(){

while(cin>>n>>m&&(n||m)){

//读入边

ans=100000;

for(int i=0;i<m;i++){

cin>>edge[i].l>>edge[i].r>>edge[i].w;

}

Kruskal();

if(ans==100000)cout<<"-1"<<endl;

else cout<<ans<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: