您的位置:首页 > 其它

UVA 1395 Slim Span(生成树)

2016-04-16 12:06 246 查看
题意:给一个n结点的图,求最大边减去最小边尽量小的生成树

思路:首先把边的权值从小到大排序,对于一个连续的区间[L,R],如果这些边使得n个结点连通,则一定存在一个苗条度不超过W[R]-W[L]的生成树,那么可以从小到大枚举L,对于每个L,从小到大枚举R

#include<bits/stdc++.h>
using namespace std;

const int maxn = 100+10;
const int maxm = 10000+10;
#define INF 1e9
struct Edge
{
int u,v,dist;
Edge(){}
Edge(int u,int v,int dist):u(u),v(v),dist(dist){}
bool operator<(const Edge&rhs)const
{
return dist < rhs.dist;
}
};
int fa[maxn];
Edge e[maxm];
int findset(int x)
{
return fa[x]==-1?x:fa[x]=findset(fa[x]);
}
int main()
{
int n,m;
while (scanf("%d%d",&n,&m)!=EOF && (n||m))
{
for (int i = 1;i<=m;i++)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
e[i]=Edge(u,v,d);
}
sort(e+1,e+m+1);
int ans = INF;
for (int L=1;L<=m;L++)
{
int sum = 0;
memset(fa,-1,sizeof(fa));
for (int R = L;R<=m;R++)
{
if (findset(e[R].u)!=findset(e[R].v))
{
sum++;
fa[findset(e[R].u)]=findset(e[R].v);
}
if (sum>=n-1)
{
ans = min(ans,e[R].dist-e[L].dist);
break;
}
}
}
if (ans==INF)
printf("-1\n");
else
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: