当前位置:编程学习 > C/C++ >>

hdu 1598


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

下面是AC代码:
[cpp] 
#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; 
                } 
            }   www.zzzyk.com
 
         if(min_val==0x7fffffff) min_val=-1; 
             printf("%d\n",min_val); 
        } 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,