find the most comfortable road

Problem Description
XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),<br>但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。<br>
 
Input
输入包括多个测试实例,每个实例包括:<br>第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。<br>接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000<br>然后是一个正整数Q(Q<11),表示寻路的个数。<br>接下来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
 
思路:一开始想着是用Dijkstra算法算出某点到其他点的最短路径,然后再求最短路径上的最大权值和最小权值上的差值,但是编写时发现工程量十分巨大。参考了其他的思路发现最小生成树也可以实现,通过集合合并,从起始点开始,当起始点和终点合并在一个集合,构成通路,则说明存在一条联通路径。在合并中,通过比较连通路径,找到最短路径。
 
代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
//x到y,权值
struct path
{
  int x,y,w;
}a[1212];

int f[250];
//找出最短路径上最大最小权值
int cmp(path a,path b)
{
  return a.w<b.w;
}

//寻找a的根节点
int MyFind(int a)
{
  int r=a;
  while(f[r]!=r)
  r=f[r];
  int i=a;
  int j;
  while(i!=r)
  {
    j=f[i];
    f[i]=r;
    i=j;
  }
  return r;
}

//如果两个顶点不在一个集合中,开始合并
void MyMerge(int a,int b)
{
  int A,B;
  A=MyFind(a);
  B=MyFind(b);
  if(A!=B)
  f[B]=A;
}
int main()
{
  int n,m;
  while(~scanf("%d%d",&n,&m))
  {
    for(int i=0;i<m;i++)
    {
      scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
    }
    sort(a,a+m,cmp);
    //输出寻路个数
    int q;
    scanf("%d",&q);
    while(q--)
    {
    //如果两顶点之间没有路径,则标记为无穷大
      int ans=0x3f3f3f3f;
      int u,v;
    //输出起始点和终点
      scanf("%d%d",&u,&v);
      for(int i=0;i<m;i++)
      {
        for(int j=0;j<=n;j++)f[j]=j;
        for(int j=i;j<m;j++)
        {
          MyMerge(a[j].x,a[j].y);
          //起始点和终点在一个集合中,有通路,开始比较与上个通路的大小
          if(MyFind(u)==MyFind(v))
          {
            ans=min(ans,a[j].w-a[i].w);
          }
        }
      }
      if(ans!=0x3f3f3f3f)
        printf("%d\n",ans);
      else
        printf("-1\n");
    }
  }

  return 0;
}

 
posted @ 2016-07-06 17:22  SDAU_ZG  阅读(154)  评论(0)    收藏  举报