您的位置:首页 > 其它

UVa 1395 Slim Span

2015-05-06 17:31 204 查看
问题:给出一个n结点的图,求最大边与最小边差值最小的生成树

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: