hncu 1598 find the most comfortable road(并查集+枚举)

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接下来的行是三个正整数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
 
思路:
先将道 路权值自小到大排序,再依次枚举权值下限,每次枚举一个下限时,初始化一次,然后Kruskal算法直到A、B两点被连通,记录这一路的极值。接着循环枚举下一个下限,即比前一个下限大一点的权值。直到所有权值被枚举完,此时极值中的最小值就得到了。
代码:
 1 #include
 2 #include
 3 using namespace std;
 4 #define INF 9999999
 5 struct nod
 6 {
 7     int a,b,c;
 8 }node[1010];
 9 int comp(nod a,nod b){return a.c<b.c;}
10 int parent[210];
11 int findp(int a)
12 {
13     while(a!=parent[a])
14         a=parent[a];
15     return a;
16 }
17 void merge(int a,int b)
18 {
19     a=findp(a);
20     b=findp(b);
21     int t;
22     if(a>b)
23         t=a,a=b,b=t;
24     if(a!=b)
25         parent[b]=a;
26 }
27 int main()
28 {
29     int n,m,q;
30     while(~scanf("%d%d",&n,&m))
31     {
32         int i,j;
33         int a,b,c;
34         for(i=1;i<=m;i++)
35             scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].c);
36         sort(node+1,node+1+m,comp);
37         scanf("%d",&q);
38         while(q--)
39         {
40             scanf("%d%d",&a,&b);
41             int min=INF;
42             for(i=1;i<=m;i++)
43             {
44                 for(j=1;j<=n;j++)
45                     parent[j]=j;
46                 for(j=i;j<=m;j++)
47                 {
48                     merge(node[j].a,node[j].b);
49                     int x=findp(a); 
50                     int y=findp(b);
51                     if(x==y)
52                     {
53                         if(min>node[j].c-node[i].c)
54                             min=node[j].c-node[i].c;
55                         break;
56                     }
57                 }
58             }
59             printf("%d\n",min==INF?-1:min);
60         }
61     }
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/crazyapple/archive/2012/08/20/2648183.html

你可能感兴趣的:(php)