题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=1248
描述
神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。杰克船长准备从自己所占领的岛屿A开始征程,逐个去占领每一个岛屿。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。
杰克船长手头有一张整个海域的海图,上面详细地记录了各个海屿的位置,以及海屿之间的通航路线。但他发现,有的航海路线太危险了,杰克船长的战船很难直接通过,他必须想方设法绕道航行;还有的岛屿根本到达不了。
杰克船长现在想把航行的危险程度降到最小。具体地来说,就是杰克船长提出若干个询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少。
- 输入
- 第1行: N M 表示有N个岛屿,M条直航路线
第2~M+1行: A B V 表示从岛屿A到岛屿B的航海路线的危险程度值为V。
接下面一行 : Q 表示询问的次数。
之后有Q个行: A B 表示询问从岛屿A 到岛屿B 所经过的航线,危险程度最小值
1<N≤100 0<M≤500 1≤ Q≤20 0 < V≤1000,
所有数据都是正整数。输入数据之间有一个空格。 - 输出
- 对于每个询问,输出占一行,一个整数,表示从岛屿A 到岛屿B 所经过的航线,危险程度最小值;若从岛屿A 无法到达岛屿B,则输出-1。
- 样例输入
-
10 8 1 2 5 1 3 2 2 3 11 2 4 6 2 4 4 6 7 10 6 10 5 10 7 2 5 2 3 1 4 3 7 6 7 8 3
- 样例输出
-
5 5 -1 5 -1
- 来源 第七届河南省程序设计大赛
- 题意描述:
- 输入顶点个数和道路条数以及道路信息
- 计算并输出最短路径的最大权值
- 解题思路:
- 求最短路径中的最大权值,使用Dijkstra变形算法即可。另外需要注意的是可能输入孤立点,那么遍历的时候可能会出现未知错误,所以加一条判断,当u没有被改变的时候,直接结束,输出-1
- 即可。
- AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 const int inf=99999999; 6 int n,m,e[210][210],book[210],dis[210]; 7 void Dijkstra(int a,int b); 8 int main() 9 { 10 int t1,t2,t3,t,a,b,i,j,k; 11 while(scanf("%d%d",&n,&m) != EOF) 12 { 13 for(i=1;i<=n;i++) 14 { 15 for(j=1;j<=n;j++) 16 { 17 if(i==j) 18 e[i][j]=0; 19 else 20 e[i][j]=inf; 21 } 22 } 23 for(i=1;i<=m;i++) 24 { 25 scanf("%d%d%d",&t1,&t2,&t3); 26 e[t1][t2]=e[t2][t1]=t3; 27 } 28 scanf("%d",&t); 29 while(t--) 30 { 31 scanf("%d%d",&a,&b); 32 if(a==b) 33 printf("0 "); 34 else 35 Dijkstra(a,b); 36 } 37 } 38 } 39 void Dijkstra(int a,int b) 40 { 41 int i,j,u,v,mina; 42 memset(book,0,sizeof(book)); 43 book[a]=1; 44 for(i=1;i<=n;i++) 45 dis[i]=e[a][i]; 46 u=-1; 47 for(i=1;i<=n-1;i++) 48 { 49 mina=inf; 50 for(j=1;j<=n;j++) 51 { 52 if(!book[j] && dis[j] < mina) 53 { 54 mina=dis[j]; 55 u=j; 56 } 57 } 58 if(u==-1) 59 break; 60 book[u]=1; 61 for(v=1;v<=n;v++) 62 { 63 if(dis[v] > max(dis[u],e[u][v])) 64 dis[v]=max(dis[u],e[u][v]); 65 } 66 } 67 if(dis[b]==inf || u==-1) 68 printf("-1 "); 69 else 70 printf("%d ",dis[b]); 71 }