find the most comfortable road

2人阅读 评论(0) 收藏 举报

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

主要是用到了并查集和枚举,通过枚举来表示不同的连通状态。

题解: 用贪心的策咯将所有的路按照速度从小到大的顺序存储,然后在枚举每一个路 road1与它后边比它速度大的所有路road2,用并查集判断所求的两个点是否联通,如果两个点连通,那么最大值就是现在枚举到的点road2,最小值就是前面road1,如果此时的road2  - road1 更小,更新min = road2 - road1,一直枚举完所有的路;

#include <iostream>  
#include <algorithm>  
#include <cstdio>  
#include <cstring>  
#include <vector>  
using namespace std;  
const int maxn = 1e5+5;  
int n,m;  
int inf = INT_MAX;  
int acount[maxn][20];      
int amount[maxn];  
int pre[maxn];   //并查集  
struct edge{  
    int s,e,speed;  
    edge(int a,int b,int c){  
        s = a,e = b, speed = c;   
     }  
     friend bool operator<(const edge&e1,const edge&e2){  
        return e1.speed < e2.speed;                    //sort按照速度从小到大排序  
     }  
};  
int find(int x){  
    return x ==pre[x] ? x : pre[x]=find(pre[x]);    //并查集找父节点  
}  
int main(){  
    int ans = 0;  
    while(scanf("%d%d",&n,&m)!= EOF){  
        vector<edge>edges;  
        for(int i = 1; i<= m;i++){  
            int s,e,speed;  
            cin>>s>>e>>speed;  
            edges.push_back(edge(s,e,speed));    //初始化  
        }  
        sort(edges.begin(),edges.end());  //将所有的路按照从小到大的顺序存储  
        int start,end;  
        int q;  
        cin>>q;  
        amount[ans]=q;  
        for(int k =0; k < q; k++){  
            cin>>start>>end;     //所求两点  
            int mi = inf;  
            for(int i = 0; i < edges.size();i++){    //枚举 所有的路  
                for(int i2 = 0; i2<= n ;i2++)    
                    pre[i2]=i2;  
                for(int j = i; j <  edges.size();j++){   //枚举从i以后所有的路  
                    int fs = find(edges[j].s);     //从i以后的所有路都要加入并查集中  
                    int fe = find(edges[j].e);  
                    if(fs != fe)  
                        pre[fs]=fe;  
                    if(find(start)==find(end)){    //如果此时start 和 end 恰好连通 我们就可以开始更新mi   
                        mi = min(mi,edges[j].speed-edges[i].speed);          // 因为i是枚举作为第一条路所以最小值是edge[i].speed 而 edge[j].speed 是当前最后枚举的 所以它为最大值  
                    }  
                }  
            }if(mi == inf) acount[ans][k] = -1;else  
        acount[ans][k]=mi;  
        }  
        ans++;  
    }  
  
    for(int i = 0; i < ans ;i++)  
        for(int j =0; j < amount[i];j++)  
            cout<<acount[i][j]<<endl;  
    return 0;  
      
}  

查看评论

hdu1598 find the most comfortable road 并查集+贪心

题目链接:here 题意。。。虽然题目是英文。。。但是题都是中文。。这里就不多叨叨了。。。。 分析: 主要运用了并查集,和贪心,先把所有公路的速度,由小到大排序,然后一条一条的取,最后所有公路差...
  • liuqiyao_01
  • liuqiyao_01
  • 2013年04月29日 16:40
  • 2738

find the most comfortable road(并查集加贪心)

点击打开链接 啊啊啊、、终于有道题一遍ac啊,激动。。。。。   1、题目大意、找出一条城市间的最舒适的路径 每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如...
  • sdjzping
  • sdjzping
  • 2013年01月23日 16:26
  • 1183

HDU 1598 find the most comfortable road (枚举+Kruskal)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 题目: Problem Description XX星有许多城市,...
  • shuangde800
  • shuangde800
  • 2012年09月10日 00:06
  • 3122

find the most comfortable road

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...
  • zuguodexiaoguoabc
  • zuguodexiaoguoabc
  • 2015年09月30日 20:46
  • 234

find the most comfortable road||HDU1598

link:http://acm.hdu.edu.cn/showproblem.php?pid=1598 Problem DescriptionXX星有许多城市,城市之间通过一种奇怪的高速公路SARS...
  • csdn_muxin
  • csdn_muxin
  • 2017年08月09日 20:41
  • 72

find the most comfortable road(并查集)

find the most comfortable road Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K ...
  • flqbestboy
  • flqbestboy
  • 2012年09月16日 19:55
  • 533

HDU_1598 find the most comfortable road

find the most comfortable road Problem Description XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Str...
  • yuniZZ
  • yuniZZ
  • 2014年08月11日 10:46
  • 265

HDU1598 find the most comfortable road

XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Spee...
  • we1215053460
  • we1215053460
  • 2017年07月20日 18:36
  • 53

HDU-1598 find the most comfortable road

#include #include #include #include using namespace std; const int maxn = 1000 + 5; int root[m...
  • somniloquy_
  • somniloquy_
  • 2015年09月11日 09:25
  • 232

【并查集】find the most comfortable road

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...
  • ACM_Ted
  • ACM_Ted
  • 2012年04月05日 20:53
  • 407
    个人资料
    等级:
    访问量: 147
    积分: 115
    排名: 122万+
    文章分类
    文章存档