poj3522 kruskal+枚举
题目的意思是求构成生成树的边的最大边和最小边的差最小。枚举即可
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxn 102 struct node { int x; int y; int val; }s[maxn*(maxn-1)/2]; int n,m,pa[maxn*(maxn-1)/2]; bool cmp(node a,node b) { return a.val>b.val; } void init() { int i; for(i=0;i<=n;i++) pa[i]=i; } int find(int x) { if(x!=pa[x]) pa[x]=find(pa[x]); return pa[x]; } void kruskal() { int i,j,count,min,max,ans,flag; count=0; flag=0; ans=99999999; for(i=0;i<m;i++) { init(); max=0;min=99999999;count=0; for(j=i;j<m;j++) { int l1,l2; l1=find(s[j].x);l2=find(s[j].y); if(l1!=l2) { pa[l1]=l2; if(max<s[j].val)max=s[j].val; if(min>s[j].val)min=s[j].val; count++; } } if(count==n-1){ flag=1; if(ans>max-min) ans=max-min; } } if(flag) printf("%d\n",ans); else printf("-1\n"); } int main() { int i,j; while(scanf("%d%d",&n,&m)!=EOF){ if(!m&&!n)break; for(i=0;i<m;i++) scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].val); sort(s,s+m,cmp); kruskal(); } }