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

来源:互联网 发布:sql语句查询两张表 编辑:程序博客网 时间:2024/06/05 16:46
 链接:

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


题目:

Problem Description
XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
 

Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
 

Output
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
 

Sample Input
4 41 2 22 3 41 4 13 4 221 31 2
 

Sample Output
10
代码:
#include <iostream>#include <cstdio>#include <vector>#include <algorithm>#include <cmath>using namespace std;const int maxn = 210;int n , m ;int start , ender ;int ans = 0x7ffffff;typedef struct{    int x , y , s ;}road;int Set[maxn+10];vector<road>data;bool com(road a , road b){    return a.s < b.s ;}void init(){    for(int i = 0; i < maxn; i ++)        Set[i] = i;}void input(){    road temp;    for(int i = 0; i < m; i ++)    {        scanf("%d%d%d",&temp.x,&temp.y,&temp.s);        data.push_back(temp);    }}int findfather(int x){    if(x == Set[x]) return x ;    return Set[x] = findfather(Set[x]);}void union_ab(int x , int y){    x = findfather(x);    y = findfather(y);    if(x != y)        Set[x] = y;}void deal(){    ans = 0x7ffffff;    for(int i = 0; i < (int)data.size(); i ++)    {        init();        for(int j = i; j < (int)data.size(); j ++)        {            if(findfather(data[j].x) != findfather(data[j].y))            {                union_ab(data[j].x,data[j].y);            }            if(findfather(start) == findfather(ender))            {                ans = min(ans , data[j].s - data[i].s);                break;            }        }    }    if(ans == 0x7ffffff)        printf("-1\n");    else        printf("%d\n",ans);}int main(){    int q ;    while(scanf("%d%d",&n,&m)!=EOF){        data.clear();        input();        sort(data.begin(),data.end(),com);        scanf("%d",&q);        for(int i = 0; i < q; i ++)        {            scanf("%d%d",&start,&ender);            deal();        }    }    return 0;}


0 0
原创粉丝点击