问题:给出一个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[N];

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;
}
 posted on 2015-05-06 17:31  平和之心  阅读(132)  评论(0编辑  收藏  举报