您的位置:首页 > 其它

UVA - 1395 Slim Span(最小生成树)

2017-05-17 22:27 344 查看
点击打开题目链接



题目大意:给出一个n节点的图,求出最大边减最小边尽量小的生成树。

思路:kruskal + 暴力枚举每一个l,判断生成树的苗条度是否最小。

附上AC代码:

#include<iostream>
#include<algorithm>
#include<climits>
#include<cstring>

using namespace std;
const int maxn = 10000 + 5;
int par[maxn];
int n, m;

struct edges {
int st, to, val;
bool operator < (const edges e)
{
return val < e.val;
}
}edge[maxn];

void init()
{
for(int i = 0; i < n; ++i)
par[i] = i;
}

int find(int x)
{
if (x == par[x])return x;
else return par[x] = find(par[x]);
}

int kruskal()
{
int mind = INT_MAX;
for (int l = 0; l < m; ++l)
{
init();
int cnt = n - 1;
for (int r = l; r < m; ++r)
{
int dx = find(edge[r].st);
int dy = find(edge[r].to);
if (dx != dy)
{
if (dx < dy)
par[dy] = dx;
else
par[dx] = dy;
cnt--;
}
if (cnt == 0)
{
mind = min(mind, edge[r].val - edge[l].val);
break;
}
}
}
return mind;
}

int main()
{
ios::sync_with_stdio(false);

while (cin >> n >> m,n)
{
init();
memset(par, 0, sizeof(par));
for (int i = 0; i < m; ++i)
{
cin >> edge[i].st >> edge[i].to >> edge[i].val;
}
sort(edge, edge + m);
int ans = kruskal();
if (ans == INT_MAX)cout << "-1" << endl;
else cout << ans << endl;
}
// system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息