hdu 1598

来源:互联网 发布:数据找回软件 编辑:程序博客网 时间:2024/06/05 08:04

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1598


可以用并查集,也可以用二分+单元最短距离做。思路都差不多。都是枚举上下界。先将速度排序。然后枚举上界,添加其他节点。如果能使a->b联通,那么当前这个舒适值就是上界-新添加的这个节点(使a-b联通的)。

然后求一个最小值就行了。


下面是AC代码:

#include<cstdio>#include<algorithm>using namespace std;const int maxn = 210;struct node{    int s,e;    int speed;}road[1010];int fa[maxn];bool cmp(const node a,const node b){     return a.speed>b.speed;}void init(){    for(int i=1;i<=210;i++) fa[i]=i;}int find(int x){    if(fa[x]!=x)        return find(fa[x]);    return fa[x];}int main(){    int n,m,Q,a,b;    while(scanf("%d%d",&n,&m)!=EOF){        for(int i=0;i<m;i++){           scanf("%d%d%d",&road[i].s,&road[i].e,&road[i].speed);        }        sort(road,road+m,cmp);        scanf("%d",&Q);        while(Q--){            int min_val = 0x7fffffff,t_val;            scanf("%d%d",&a,&b);            for(int i=0;i<m-1;i++){                init();  t_val=0x7fffffff;                int s=road[i].s,       e=road[i].e;                int fs=find(s);   int fe=find(e);                if(fs!=fe){                   fa[fs]=fe;                }                if(find(a)==find(b)){                    min_val=0;                        break;                }                for(int j=i+1;j<m;j++){                    s=road[j].s;   e=road[j].e;                    fs=find(s);   fe=find(e);                    if(fs!=fe){                       fa[fs]=fe;                    }                    if(find(a)==find(b)){                        t_val=road[i].speed-road[j].speed;                        break;                    }                }                if(min_val>t_val){                   min_val=t_val;                }            }         if(min_val==0x7fffffff) min_val=-1;             printf("%d\n",min_val);        }    }    return 0;}


原创粉丝点击