UVA - 1395 Slim Span
2017-05-05 22:37
260 查看
枚举最小的边权,用剩下来的边建最小生成树即可
#include<iostream> #include<string> #include<cstdio> #include<set> #include<map> #include<stack> #include<list> #include<vector> #include<queue> #include<algorithm> #include<cstring> #include<cmath> #include<fstream> using namespace std; typedef long long ll; const int maxn = 10010,INF = 0x3f3f3f3f; int m,n; struct node{ int u,v,w; bool operator < (const node &a) const{ return w < a.w; } }; vector<node> e; int fa[maxn]; int find(int x){ if (x == fa[x]) return x; else return fa[x] = find(fa[x]); } int kruskal(int st){ int sum = 1,k = st; for(int i = 1;i <= n;++i) fa[i] = i; for(;k < m;++k){ int x = find(e[k].u),y = find(e[k].v); if (x != y) { fa[x] = y; sum++; } if (sum == n) return k; } return -1; } void build(){ int ans = INF; int mark = -1; for(int l = 0;l < m;++l){ if (e[l].w == mark) continue; int r = kruskal(l); if (r != -1){ mark = e[l].w; ans = min(e[r].w - e[l].w,ans); } else break; } if (ans == INF) ans = -1; cout << ans << endl; } void init(){ int u,v,w; e.clear(); for(int i = 0;i < m;++i){ cin >> u >> v >> w; e.push_back({u,v,w}); } sort(e.begin(),e.end()); build(); } int main(){ while(cin >> n >> m && n + m){ init(); } }
相关文章推荐
- UVA 1395 Slim Span
- UVa 1395 (最小生成树) Slim Span
- UVA - 1395 Slim Span(最小生成树)
- 【UVA】1395-Slim Span
- UVa 1395 Slim Span
- UVa 1395 slim span
- Uva1395——Slim Span
- UVa 1395 Slim Span
- uva1395 Slim Span
- UVA-1395 Slim Span
- (beginer) 最小生成树 UVA 1395 Slim Span
- UVA 1395 Slim Span 最小生成树
- UVA 1395 Slim Span
- Uva 1395 Slim Span
- UVA 1395 Slim Span
- UVA 1395 Slim Span
- UVA-1395 Slim Span
- uva 1395 Slim Span
- UVA 1395 Slim Span
- UVA - 1395 Slim Span