find the most comfortable road

find the most comfortable road

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7640    Accepted Submission(s): 3218


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 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2
 

Sample Output
  
  
1 0
 
题意:先输入每两条可行路及其长度,再输入起点和终点,找出从起点到终点的可行路中的最大速度与最小速度之差
 
思路:先将通路的权按从小到大的顺序排列,用并查集找出可行路,再找出速度之差最大的。
 
代码:

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f

int book[10001]; int n,m,i,j,a,b,t,ans; struct node {     int u,v,w;    //定义结构体变量,分别表示StartCity,EndCity,speed } q[1010];        //定义结构体数组

bool cmp(node a,node b) {     return a.w<b.w;  //按权值的大小从小到大排序 }

int getf(int a) {     if(book[a]==a)         return a;        else            //路径压缩     {         book[a]=getf(book[a]);         return book[a];     } }

int merge(int a,int b) {     int t1,t2;     t1=getf(a);     t2=getf(b);     if(t1!=t2)    //判断两个节点是否在同一个集合中     {         book[t2]=t1;//靠左原则         return 1;     }     return 0; }

int main() {     while(~scanf("%d%d",&n,&m))     {         int f;         for(i=1; i<=m; i++)             scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);         sort(q+1,q+1+m,cmp);         scanf("%d",&t);         for(i=1; i<=t; i++)         {             ans=inf;             scanf("%d%d",&a,&b);             for(j=1; j<=m; j++)             {                 for(f=1; f<=n; f++)                     book[f]=f;      //每进行一次,初始化一次                 for(int k=j; k<=m; k++)                 {                     merge(q[k].u,q[k].v);                     if(getf(a)==getf(b))                     {                         ans=min(ans,q[k].w-q[j].w);  //找出两个相邻的速度差最小的                         break;                     }                 }             }             if(ans==inf)                 printf("-1\n");             else                 printf("%d\n",ans);         }     }     return 0; }

 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值