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
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2
Sample Output
1
0
0
***************************************************************************************************************************
程序中有解释
***************************************************************************************************************************
1 /* 2 贪心排序&&枚举每次并查集形成的树,并比较输出结果 3 */ 4 #include<iostream> 5 #include<string> 6 #include<cstring> 7 #include<cstdio> 8 #include<cmath> 9 #include<algorithm> 10 using namespace std; 11 const int inf=1<<30; 12 int fa[1001],n,m,a,b,i,j,k,Q; 13 struct edge 14 { 15 int u,v,w; 16 }e[10001]; 17 bool cmp(edge a,edge b) 18 { 19 return a.w<b.w; 20 } 21 void init() 22 { 23 int it; 24 for(int it=0;it<=n;it++) 25 fa[it]=it; 26 } 27 int find(int x)//寻找祖先节点并更新相应链上的节点的祖先 28 { 29 int r=x; 30 while(r!=fa[r])r=fa[r]; 31 while(x!=r) 32 { 33 int temp=fa[x]; 34 fa[x]=r; 35 x=temp; 36 } 37 return r; 38 } 39 void Unon(int a,int b)//并查集的并(没有优化) 40 { 41 int x=find(a); 42 int y=find(b); 43 if(x==y)return; 44 fa[x]=y; 45 } 46 int main() 47 { 48 while(scanf("%d %d",&n,&m)!=EOF) 49 { 50 for(i=0;i<m;i++) 51 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); 52 sort(e,e+m,cmp);//从小到大排序 53 //for(i=0;i<m;i++) 54 //printf("w:: %d ",e[i].w); 55 //printf(" "); 56 scanf("%d",&Q); 57 while(Q--) 58 { 59 bool gs; 60 int ans=inf,k=0; 61 scanf("%d%d",&a,&b); 62 for(i=0;i<m;i++) 63 { 64 init();//每次比较,每次更新 65 gs=false; 66 for(j=i;j<m;j++) 67 { 68 Unon(e[j].u,e[j].v); 69 if(find(a)==find(b))//找到跳出(原因因为排序) 70 { 71 gs=true; 72 k=j; 73 break; 74 } 75 } 76 if(!gs)break; 77 ans=min(ans,e[k].w-e[i].w); 78 //cout<<"ans:: "<<ans<<endl; 79 } 80 if(ans==inf) 81 printf("-1 "); 82 else 83 printf("%d ",ans); 84 } 85 } 86 return 0; 87 }