UVA

来源:互联网 发布:剑三新建角色捏脸数据 编辑:程序博客网 时间:2024/05/22 00:49

点击打开题目链接



题目大意:给出一个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;elsepar[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;}


原创粉丝点击