poj 3522 Slim Span 最大边减最小边最小的生成树
枚举最小边进行kruskal。
#include <cstdio> #include <algorithm> using namespace std; #define maxn 120 #define maxm 10000 struct 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; }