码迷,mamicode.com
首页 > 其他好文 > 详细

UVA UVA - 1395 Slim Span

时间:2015-08-25 18:28:50      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

点很少,按边权值排序,枚举枚举L和R,检查连通性。一旦连通,那么更新答案。

判断连通用可以O(1),之前我是O(n)判的,之前写的过了,后来写的T了。。。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 101;
const int maxe = maxn*maxn>>1;
int n,m;

int u[maxe],v[maxe],w[maxe];

int pa[maxn];

inline bool cmp(int a,int b) { return w[a]<w[b]; }
int r[maxe];

inline void idxSort()
{
    for(int i = 0; i < m; i++) r[i] = i;
    sort(r,r+m,cmp);
}

int Find(int x) { return x==pa[x]?x:pa[x]=Find(pa[x]); }
int cnt,ans;

inline void Union(int a,int b)
{
    int s1 = Find(a),s2 = Find(b);
    if(s1 != s2){
        pa[s1] = s2,cnt--;
    }
}


inline void initUFS() { for(int i = 1; i <= n; i++) pa[i] = i; cnt = n-1; }

const int INF = 0x3f3f3f3f;


int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m),n){
        for(int i = 0; i < m; i++)
            scanf("%d%d%d",u+i,v+i,w+i);

        idxSort();
        ans = INF;
        for(int i = 0; i < m; i++){
            initUFS();
            for(int j = i; j < m; j++){
                int R = r[j];
                Union(u[R],v[R]);
                if(!cnt) {
                    ans = min(ans,w[R]-w[r[i]]); break;
                }
            }
        }
        printf("%d\n",ans==INF?-1:ans);
    }
    return 0;
}

 

UVA UVA - 1395 Slim Span

标签:

原文地址:http://www.cnblogs.com/jerryRey/p/4757713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!