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;
}
题目大意:给出一个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;
}
相关文章推荐
- UVa 1395 (最小生成树) Slim Span
- (beginer) 最小生成树 UVA 1395 Slim Span
- UVA 1395 Slim Span 最小生成树
- UVA 1395 Slim Span (最小生成树,MST,kruscal)
- uva1395 枚举不同区间的最小生成树
- uva 1395 Slim Span 最小生成树
- 例题11-2 UVA - 1395 Slim Span 苗条的生成树(Kruscal最小生成树)
- 苗条的生长树slim span,uva1395——最小生成树,kruskal
- UVA-1395(最小瓶颈生成树)
- UVa 1395 Slim Span (最小生成树)
- UVA 1395 Slim Span(最小生成树)
- [枚举最小瓶颈生成树]UVa-1395 - Slim Span(kruskal)
- uva 1395 Slim Span[最小生成树]
- UVA - 1395 Slim Span(最小生成树相关)
- UVA1395 Slim Span(枚举最小生成树)
- UVa 1395 最小生成树
- uva 1395 苗条的生成树(最小生成树入门)
- UVA 1395 Slim Span 最小生成树
- UVA 1395 Slim Span 最小生成树
- uva 1395 - Slim Span poj 3522 Slim Span(最小生成树算法)