poj-3522-Slim Span-kruskal活用
2014-04-09 16:22
351 查看
本题的题意是让你求一颗生成树,使得最大边-最小边最小。
枚举最小边。kruskal求生成树的最大边。
枚举最小边。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; }
相关文章推荐
- poj 3522 Slim Span(Kruskal+枚举)
- poj 3522 Slim Span(Kruskal+枚举)
- POJ 3522 Slim Span (Kruskal +枚举 边权差最小的生成树)
- poj 3522 Slim Span (最小生成树kruskal)
- poj 3522 Slim Span(Kruskal+枚举)
- poj 3522 Slim Span(Kruskal+枚举)
- POJ - 3522 Slim Span (kruskal+枚举)
- poj 3522 Slim Span(Kruskal+枚举)
- POJ 3522 Slim Span (Kruskal+枚举)
- POJ 3522 Slim Span (并查集 + 枚举 + kruskal)
- poj 3522 Slim Span(Kruskal+枚举)
- POJ 3522 Slim Span(最小生成树-Kruskal)
- poj 3522 Slim Span(Kruskal+枚举)
- POJ 3522 Slim Span(kruskal 变型)
- poj 3522 Slim Span(Kruskal+枚举)
- poj 3522 Slim Span(Kruskal+枚举)
- poj 3522 Slim Span(Kruskal+枚举)
- poj 3522 Slim Span (Kruskal+枚举)
- poj 3522 Slim Span (最小生成树 的 一个性质 kruskal 的 应用 )
- poj 3522 Slim Span(Kruskal+枚举)