首页 > 代码库 > UVALIVE 3887 Slim Span

UVALIVE 3887 Slim Span

#include <map>#include <set>#include <list>#include <cmath>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <climits>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}#define MAXN 110struct node{        int u,v,w;        friend bool operator < (const node &a,const node &b)        {                return a.w < b.w;        }}edge[MAXN * MAXN];int N,M;int p[MAXN];int Find(int x) {return x == p[x] ? x : p[x] = Find(p[x]);}int kruskal(int cur){        int ans = -1,cnt = 0;        for (int i = 0 ; i <= N; i++) p[i] = i;        for (int i = 0 ; i < M; i++)        {                if (edge[i].w < cur) continue;                int x = Find(edge[i].u), y = Find(edge[i].v);                if (x != y)                {                        p[x] = y;                        cnt++;                        ans = max(ans,edge[i].w);                }                if (cnt == N - 1) break;        }        if (cnt == N - 1) return ans - cur;        else return -1;}int main(){       // freopen("sample.txt","r",stdin);        while (scanf("%d%d",&N,&M) != EOF)        {                if (N == 0 && M == 0) break;                for (int i = 0 ; i < M; i++)                        scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);                int ans = INT_MAX;                sort(edge,edge + M);                for (int i = 0 ; i < M; i++)                {                        int tmp = kruskal(edge[i].w);                        if (tmp == -1) break;                        else ans = min (ans,tmp);                }                if (ans == INT_MAX) puts("-1");                else printf("%d\n",ans);        }        return 0;}

 

UVALIVE 3887 Slim Span