首页 > 代码库 > poj 3522 Slim Span 最大边减最小边最小的生成树
poj 3522 Slim Span 最大边减最小边最小的生成树
枚举最小边进行kruskal。
#include <cstdio>#include <algorithm>using namespace std;#define maxn 120#define maxm 10000struct edge{ int u,v,w;}e[maxm];int p[maxn],n,m;int find(int x){ if(x==p[x]) return x; return p[x]=find(p[x]);}void link(int a,int b){ int fa=find(a); int fb=find(b); if(fa!=fb) p[fa]=fb;}int cmp(const void *a,const void *b){ edge aa=*(const edge*)a; edge bb=*(const edge*)b; return aa.w-bb.w;}int main(){ while(1) { scanf("%d%d",&n,&m); if(n+m==0) break; int i,j; int u,v,w; int l,r; for(i=0;i<m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); qsort(e,m,sizeof(e[0]),cmp); int minn=10000000; for(l=0;l<m;l++) { int num=0; for(i=1;i<=n;i++) p[i]=i; for(i=l;i<m;i++) { u=e[i].u; v=e[i].v; w=e[i].w; if(find(u)!=find(v)) { link(u,v); r=w; num++; } } if(num==(n-1)&&(r-e[l].w)<minn) minn=r-e[l].w; } if(minn==10000000) printf("-1\n"); else printf("%d\n",minn); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。