当前位置: 代码迷 >> 综合 >> poj-3522-Slim Span-kruskal活用
  详细解决方案

poj-3522-Slim Span-kruskal活用

热度:86   发布时间:2023-12-19 10:44:51.0

本题的题意是让你求一颗生成树,使得最大边-最小边最小。

枚举最小边。kruskal求生成树的最大边。

#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
using namespace std;
#define maxm 110*110
#define maxn 110
#define eps 0.000001
#define zero(x) ((fabs(x)<eps?0:x))
#define INF 99999999
struct list
{int u;int v;int w;friend bool operator < (const list &a,const list &b){return a.w<b.w;}
}edge[maxm];
int f[maxn];
int find(int x)
{while(x!=f[x])x=f[x];return x;
}
int main()
{int n,m,i,j,k;while(~scanf("%d%d",&n,&m)&&(n||m)){for(i=1;i<=m;i++){scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);}sort(edge+1,edge+m+1);int minn=INF;for(k=1;k<=m;k++){for(i=1;i<=n;i++)f[i]=i;int l=0;int amin,amax;amin=INF;amax=-1;for(i=k;i<=m;i++){int a=find(edge[i].u);int b=find(edge[i].v);if(a==b)continue;l++;amin=min(amin,edge[i].w);amax=max(amax,edge[i].w);f[a]=b;if(l==n-1)break;}if(l!=n-1)break;minn=min(minn,amax-amin);}if(minn==INF)cout<<"-1"<<endl;else cout<<minn<<endl;}return 0;
}


  相关解决方案