过了样例就能AC
注意一点 0条边特意判断下。是否无法构成生成树也要判断
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define maxn 110 int parent[maxn]; int N,M; struct edge { int u,v,w; }edges[maxn*maxn]; int cmp(void const *a,void const *b) { return ((struct edge *)a)->w-((struct edge *)b)->w; } int find(int a) { if(parent[a]==-1) return a; return find(parent[a]); } int krusal() { int i,j,k,m,n; int ans,tmp; qsort(edges,M,sizeof(edges[0]),cmp); ans=0x3fffffff; if(M==0) return -1; for(i=0;i<M;i++) { memset(parent,-1,sizeof(parent)); k=0;j=i; while(k<N-1 && j<M) { m=find(edges[j].u); n=find(edges[j].v); if(m!=n) { parent[find(m)]=find(n); k++;//判断是否已经满足生成树,即已经有N个点了 } j++; } if(i==0 && k<N-1) return -1; if(k<N-1) continue; tmp=edges[j-1].w-edges[i].w; ans=ans<tmp?ans:tmp; } return ans; } int main() { int i; while(scanf("%d%d",&N,&M),M+N) { for(i=0;i<M;i++) scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w); printf("%d\n",krusal()); } return 0; }
poj 3522 枚举+kruskal,布布扣,bubuko.com
原文:http://blog.csdn.net/gg_gogoing/article/details/38616529