hdu 1598

题目: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;
}


你可能感兴趣的:(struct)