zoukankan      html  css  js  c++  java
  • 最少换乘

    题解 : 给你几班车 , 主人公想从 1 到 N 问你需要 换乘几辆车 ?    对于这种 有去无回的 图 , 不需要做特殊处理 .

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<iostream>
     5 #include<limits.h>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 #include<set>
    10 #include<stack>
    11 #include<string>
    12 #include<sstream>
    13 #include<map>
    14 #include<cctype>
    15 using namespace std;      //最少换乘  ,  由于是单源最短路径的求解 还是不用 Floyd 了 , 以免超时 , 而且已经证明这一道题上  Floyd是 Dijkstra的 100倍
    16 int visited[505],dis[505],a[505][505];
    17 int Dijkstra(int n)
    18 {
    19     for(int i=1;i<=n;i++)       //  将 和 1   连接 , 的储存到dis中
    20         dis[i]=a[1][i];
    21     dis[1]=0;
    22     visited[1]=1;
    23     for(int i=1;i<=n;i++)   // 一共有 七个站点
    24     {
    25         int v,minn=INT_MAX;
    26         for(int j=1;j<=n;j++)
    27         {
    28             if(minn>dis[j]&&!visited[j])
    29             {
    30                 minn=dis[j];
    31                 v=j;
    32             }
    33         }
    34         visited[v]=1;
    35         for(int j=1;j<=n;j++)
    36         {
    37             if(!visited[j]&&a[v][j]!=INT_MAX&&dis[v]!=INT_MAX&&dis[j]>dis[v]+a[v][j])        //  用  INT_MAX的 话存在一个问题就是只要一 + 就从最大值变成最小值 所以   用INT_MAX的话 需要谨慎对待相加问题
    38             {
    39                 dis[j]=dis[v]+a[v][j];
    40             }
    41         }
    42     }
    43     return dis[n];
    44 }
    45 int main()
    46 {
    47     int t,n,m;
    48     string road;
    49     scanf("%d",&t);
    50     while(t--)
    51     {
    52         scanf("%d%d",&m,&n);
    53         for(int i=0;i<=n;i++)
    54         {
    55             dis[i]=INT_MAX;
    56             for(int j=0;j<=n;j++)
    57                 a[i][j]=INT_MAX;
    58         }
    59         memset(visited,0,sizeof(visited));
    60         if(t!=0)
    61             getchar();
    62         for(int i=0;i<m;i++)
    63         {
    64             int sum=0;
    65             getline(cin,road);   // 第一行数据
    66             int q=0;
    67             for(int j=0;j<road.size();j++)
    68             {
    69                 if(road[j]==' ')
    70                 {
    71                     dis[q++]=sum;
    72                     sum=0;
    73                     continue;
    74                 }
    75                 sum=sum*10+road[j]-'0';
    76             }
    77             dis[q++]=sum;
    78             for(int w=0;w<q;w++)
    79                 for(int j=w+1;j<q;j++)
    80                 a[dis[w]][dis[j]]=1;   //  一路车的 换乘次数就是 1 .   在每个 可以直接到达的地方 都是 1 , 如果需要倒车的话 在 +1
    81         }
    82         int e=Dijkstra(n);
    83         if(e==INT_MAX)
    84             printf("NO
    ");
    85         else
    86             printf("%d
    ",e-1);
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    时间操作、时间戳
    滚动条大于120px时,判断pc端的情况下,导航条固定定位
    通过js中的useragrent来判断设备是pc端还是移动端,跳转不同的地址
    js构建函数,点击按钮显示div,再点击按钮或其他区域,隐藏div
    localStorage用法总结
    轮播插件、原生js编写,弄懂这个,基本上各种轮播都可以自己写了
    (原)选择远比努力重要
    Java线程之间通信
    迪杰斯特拉(Java)
    FFTW中文参考
  • 原文地址:https://www.cnblogs.com/A-FM/p/5386737.html
Copyright © 2011-2022 走看看