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是双向的)。
但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, 表示寻路的起终点。
第一行有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
思路:
先将道路权值自小到大排序,再依次枚举权值下限,每次枚举一个下限时,初始化一次,然后Kruskal算法直到A、B两点被连通,记录这一路的极值。接着循环枚举下一个下限,即比前一个下限大一点的权值。直到所有权值被枚举完,此时极值中的最小值就得到了。
代码:
1 #include<iostream> 2 #include<algorithm> 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 }