UVA

来源:互联网 发布:linux怎么解压tar文件 编辑:程序博客网 时间:2024/05/29 06:48

枚举最小的边权,用剩下来的边建最小生成树即可

#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();    }}
0 0
原创粉丝点击