您的位置:首页 > 其它

Uva1395——Slim Span

2016-03-12 14:20 369 查看
这题,最小生成树的应用,只是需要稍微变形一下。

输入结点数为n,边数为m,对每条边进行从小到大排序,然后枚举枚举每一条边,从该边起到最后这些边中求最小生成树并找到权值最大的边。不断的更新最大权值与枚举的边的差值。

代码:

#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 110;
int m, n;
int maxnt;
int p[maxn];

struct node
{
int x, y, d;
}data[5010];

int cmp(node x, node y)
{
return x.d < y.d;
}

int finds(int x)
{
return p[x] == x ? x : p[x] = finds(p[x]);
}

bool krus(int k)
{
int i, count = 0;
maxnt = -1;
for(i = 0; i <= n; i++)
p[i] = i;

for(i = k; i < m; i++)
{
int fx = finds(data[i].x);
int fy = finds(data[i].y);
if(fx != fy)
{
p[fy] = fx;
if(maxnt < data[i].d)
maxnt = data[i].d;
if(++count == n - 1)
return true;
}
}
return false;
}

int main()
{
//	freopen("1.txt", "r", stdin);
int i, j;
while(cin >> n >> m)
{
if(m == 0 && n == 0)
break;
for(i = 0; i < m; i++)
cin >> data[i].x >> data[i].y >> data[i].d;
sort(data, data + m, cmp);
int ans = 0xfffffff;
for(j = 0; j < m; j++)
{
if(krus(j))
{
if(ans > maxnt - data[j].d)
ans = maxnt - data[j].d;
}
}
if(ans == 0xfffffff)
cout << -1 << endl;
else
cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: