UVa 1395 Slim Span
2015-05-06 17:31
204 查看
问题:给出一个n结点的图,求最大边与最小边差值最小的生成树
my code:
my code:
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <algorithm> #include <map> using namespace std; #define N 102 #define INF 0x7fffffff struct Edge { int u, v, w; bool operator < (const Edge &t) const { return w < t.w; } }c[N*(N-1)/2]; int p ; int findRoot(int x) { return p[x] == x? x: p[x] = findRoot(p[x]); } void build(int l, int r, int &edge, int &maxl, int &minl) { for(int i=l; i<=r; i++) { int pu = findRoot(c[i].u); int pv = findRoot(c[i].v); if(pu != pv) { p[pu] = pv; edge++; maxl = max(maxl, c[i].w); minl = min(minl, c[i].w); } } } int main() { int n, m; int maxl, minl, edge, gap; while(cin>>n>>m, n || m) { if(m == 0){ cout<< -1 <<endl; continue; } gap = INF; for(int i=0; i<m; i++) cin>>c[i].u>>c[i].v>>c[i].w; sort(c, c+m); for(int i=0; i+n-2<m; i++) { for(int k=1; k<=n; k++) p[k] = k; maxl = -INF; minl = INF; edge = 0; build(i, i+n-2, edge, maxl, minl); if(edge == n-1){ gap = min(gap, maxl-minl); continue; } for(int j=i+n-1; j<m; j++) { build(j, j, edge, maxl, minl); if(edge == n-1){ gap = min(gap, maxl-minl); break; } } } if(gap == INF) cout<< -1 <<endl; else cout<< gap <<endl; } return 0; }
相关文章推荐
- 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
- UVA - 1395 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