find the most comfortable road-并查集带权

来源:互联网 发布:暖通常用数据 编辑:程序博客网 时间:2024/04/27 23:28

作者:点击打开链接

原题:点击打开链接

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


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 <cstdio>  #include <cstring>  #include <algorithm>  using namespace std;  #define CLR(a,b) memset(a,b,sizeof(a))  #define INF 0x3f3f3f3f  #define MAX 200  struct node  {      int u,v,cost;  }edge[1011];  bool cmp(node a ,node b)  {      return a.cost > b.cost;  }  int f[MAX+11];  int find(int x)  {      if (x != f[x])          f[x] = find (f[x]);      return f[x];  }  void join(int x,int y)  {      int fx = find (x);      int fy = find (y);      if (fx != fy)          f[fx] = fy;  }  int main()  {      int n,m;      while (~scanf ("%d %d",&n,&m))      {          for (int i = 0 ; i < m ; i++)              scanf ("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].cost);          sort(edge,edge+m,cmp);                 int q;          scanf ("%d",&q);          while (q--)          {              int st,endd;              int ans = INF;              scanf ("%d %d",&st,&endd); //稍微解释一下主循环,按权排序后(速度大的排在前面)             for (int i = 0 ; i < m ; i++) //依次枚举去掉i++条道路后的最差值最小路径             {                  for (int j = 1 ; j <= n ; j++)                      f[j] = j;                  for (int j = i ; j < m ; j++)                  {                      join(edge[j].u , edge[j].v);                      if (find(st) == find(endd))     //已经连通                      {                          ans = min(ans , edge[i].cost - edge[j].cost);                          break;                      }                  }              }              if (ans == INF)                  printf ("-1\n");              else                  printf ("%d\n",ans);          }      }      return 0;  } 


原创粉丝点击