uva 1395 Slim Span (克鲁斯卡尔变形)
2017-03-20 21:37
260 查看
题意:生成一颗最大边和最小边之差最小的生成树,并输出差值,如果不存在输出-1
思路:将边的权升序排序,枚举[L,R],L,R为边的权,如果能够生成一颗生成树,则有Min=w[R]-w[L]。L从最小开始枚举,然后枚举R,直到生成一颗生成树,或是全部枚举完都没有生成生成树,然后L取第二小的边,R从L开始枚举,依此类推。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 110;
int f[maxn];
struct edge
{
int from,to,w;
}e[maxn*maxn+20];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int Find(int x)
{
return f[x]==x?x:f[x]=Find(f[x]);
}
int main()
{
int n,m; //n=[2,100]
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&(m+n))
{
int i=0;
for(i=0;i<m;i++)
scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].w);
sort(e,e+m,cmp);
int ans=1<<30;
for(i=0;i<m;i++)
{
for(int k=1;k<=n;k++)f[k]=k;
int num=0;
int mx=-1,mn=9999999;
for(int j=i;j<m;j++)
{
int u=e[j].from,v=e[j].to;
int xx=Find(u);
int yy=Find(v);
if(xx!=yy)
{
f[xx]=yy;
num++;
if(mx<e[j].w)mx=e[j].w;
if(mn>e[j].w)mn=e[j].w;
if(num==n-1)break;
}
}
if(num==n-1&&ans>(mx-mn))
ans=mx-mn;
}
if(ans!=1<<30)
printf("%d\n",ans);
else
printf("-1\n");
}
}
思路:将边的权升序排序,枚举[L,R],L,R为边的权,如果能够生成一颗生成树,则有Min=w[R]-w[L]。L从最小开始枚举,然后枚举R,直到生成一颗生成树,或是全部枚举完都没有生成生成树,然后L取第二小的边,R从L开始枚举,依此类推。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 110;
int f[maxn];
struct edge
{
int from,to,w;
}e[maxn*maxn+20];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int Find(int x)
{
return f[x]==x?x:f[x]=Find(f[x]);
}
int main()
{
int n,m; //n=[2,100]
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&(m+n))
{
int i=0;
for(i=0;i<m;i++)
scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].w);
sort(e,e+m,cmp);
int ans=1<<30;
for(i=0;i<m;i++)
{
for(int k=1;k<=n;k++)f[k]=k;
int num=0;
int mx=-1,mn=9999999;
for(int j=i;j<m;j++)
{
int u=e[j].from,v=e[j].to;
int xx=Find(u);
int yy=Find(v);
if(xx!=yy)
{
f[xx]=yy;
num++;
if(mx<e[j].w)mx=e[j].w;
if(mn>e[j].w)mn=e[j].w;
if(num==n-1)break;
}
}
if(num==n-1&&ans>(mx-mn))
ans=mx-mn;
}
if(ans!=1<<30)
printf("%d\n",ans);
else
printf("-1\n");
}
}
相关文章推荐
- UVa--1395 Slim Span(生成树)
- 例题11-2 UVA - 1395 Slim Span 苗条的生成树(Kruscal最小生成树)
- uva1395 - Slim Span(最小生成树)
- POJ 3522 Slim Span(生成树+克鲁斯卡尔)
- UVA-1395 - Slim Span(kruskal)
- UVa 1395 - Slim Span(MST)
- UVA - 1395 Slim Span(最小生成树最大边权和最小边权之差最小)
- [生成树][Uva1395][Slim Span]
- UVA 1395 Slim Span--苗条的生成树(并查集+枚举)
- [生成树][Uva1395][Slim Span]
- UVA 1395 Slim Span(生成树)
- (UVa 1395)Slim Span (苗条的生成树)(并查集+Kruskal)
- uva 1395 slim span MST
- Slim Span UVA - 1395 ——Kruskal算法生成最小树
- UVa - 1395 - Slim Span(Kruskal算法+并查集,最小生成树)
- uva 1395 Slim Span[最小生成树]
- UVA - 1395 Slim Span (最小生成树Kruskal)
- uva 1395 Slim Span(kruskal)
- uva 1395 Slim Span 最小生成树
- uva 1395 Slim Span (最小生成树||(最大边减最小边尽量小))