zoukankan      html  css  js  c++  java
  • NYOJ 1248 海岛争霸(Dijkstra变形——最短路径最大权值)

    题目链接:

    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 }
  • 相关阅读:
    定位 -CLGeocoder
    定位
    定位
    定位- 汽车导航
    定位
    SVN
    githubRepository -- 使用
    git 常用指令
    ipad ------ 与iPhone的差别
    总结
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7412176.html
Copyright © 2011-2022 走看看