【最短路】Flycar
版权声明:本篇随笔版权归作者Etta(http://www.cnblogs.com/Etta/)所有,转载请保留原地址!
一.问题描述
Hecy被FC星人劫持了!
“长的帅也是一种罪过吗?”,Hecy问劫持他的生物,结果被暴打。唉,原来Hecy被劫持的原因是FC星人看中了他的编程才能(“我真的长的不帅吗?”Hecy不死心地问另一个生物,结果再次被暴打)。
FC星 有许多城市,某些城市之间无法直接到达,但某些城市之间可以通过一种奇怪的高速公路SARS(Super Air Roam Structure 超级空中漫游结构)进行人员或物资的交流运输。在SARS上有且仅有一种“车”可以行驶,那就是传说中的极品飞车Flycar。东东们就是乘坐着Flycar在SARS上运动的。与地球相似地,每条SARS都对行驶在他上面的Flycars有限速要求——不同的是这既不是限最高速,也不是限最低速,而是限固定速,也就是说Flycars必须以所限速度行驶,否则就要被TS(Traffic System)来一次ts(tiger strike虎击)——这可不是好玩的!
同时FC星人对flycar的“舒适度”也有特殊的要求。他们认为乘坐一次flycar过程中,flycar达到的最高速与最低速之间的差越小,本次乘坐越舒适(可以理解,因为SARS的限速要求,flycar都必须瞬间提/降速,痛苦啊)——FC星人对时间却没那么多要求。
因此Hecy的任务就明确了:为FC星上几乎垄断了flycar市场的全星通用汽车公司(CC)设计新一代自动寻路flycar,使得该flycar能自动寻找两城市间最舒适的到达路径。
任务 对于给定的公路网以及两个城市s、t,求出从s到t的最舒适路径。
输入输出格式
输入格式:
输入 输入数据的第一行两个正整数n、m(1<=n〈=200,1〈=m<=1000),n、m分别表示城市数和公路数。
接下来的m行每行三个正整数i、j、num(num〈=1000000),表示城市I,j之间有一条道路,该路的限速为num.
接下来输入整数t,表示t组询问。
每组询问给出两个正整数s、t,表示初始城市和目标城市。
输出格式:
输出 每组询问输出最舒适值。
输入输出样例
输入样例#1
2 1
1 2 1
1
1 2
输出样例#1
0
二.问题分析
看到这道题就去codevs刷1001舒适的路线了……
利用并查集,有顺序地循环枚举最大最小路径,求出答案即可。
三.解决问题
1.给边从小到大排序
2.for(i:1~m)+for(j:i~m)遍历每一条边,若边两端点不再同一集合内则合并两点,若合并后st与en在同一集合内,更新答案并break
Tip:其实题目不完整,无法到达是要输出-1的(⊙o⊙)…
四.代码实现
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 const int A=205,B=1005,inf=5e8; 6 7 int n,m,sum,minn,maxn=inf,st,en; 8 int i,j,x,y,z,k,s,t,ans1=inf,ans2=0; 9 bool bo; 10 int fa[A],ex[A],ans[A]; 11 struct edge{ 12 int from,to,len; 13 }e[B]; 14 15 void build(int x,int y,int z) 16 { 17 ++sum; 18 e[sum].from=x; 19 e[sum].to=y; 20 e[sum].len=z; 21 } 22 23 bool comp(edge x,edge y) 24 { 25 return x.len<y.len; 26 } 27 28 int find(int x) 29 { 30 if(x!=fa[x])fa[x]=find(fa[x]); 31 return fa[x]; 32 } 33 34 void un(int x,int y) 35 { 36 x=find(x); 37 y=find(y); 38 fa[x]=y; 39 } 40 41 int main() 42 { 43 scanf("%d%d",&n,&m); 44 for(i=1;i<=m;++i) 45 { 46 scanf("%d%d%d",&x,&y,&z); 47 build(x,y,z); 48 } 49 sort(e+1,e+m+1,comp); 50 scanf("%d",&t); 51 for(int g=1;g<=t;++g) 52 { 53 scanf("%d%d",&st,&en); 54 ans1=inf; 55 ans2=0; 56 for(i=1;i<=m;++i) 57 { 58 minn=e[i].len; 59 maxn=inf; 60 for(j=1;j<=n;++j)fa[j]=j; 61 for(j=i;j<=m;++j) 62 { 63 if(find(e[j].from)==find(e[j].to))continue; 64 un(e[j].from,e[j].to); 65 if(find(st)==find(en)) 66 { 67 maxn=e[j].len; 68 if(maxn-minn<ans1-ans2) 69 { 70 ans1=maxn; 71 ans2=minn; 72 } 73 break; 74 } 75 } 76 } 77 if(ans1==inf)printf("-1\n"); 78 else 79 printf("%d\n",ans1-ans2); 80 } 81 return 0; 82 }
——Etta