Uva1395——Slim Span

来源:互联网 发布:js onclick传多个参数 编辑:程序博客网 时间:2024/06/05 22:53

这题,最小生成树的应用,只是需要稍微变形一下。


输入结点数为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;elsecout << ans << endl;}return 0;}


0 0
原创粉丝点击