• 基础最短路


                基础最短路

    Description

    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 
     

    Input

    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。  输入保证至少存在1条商店到赛场的路线。 
     

    Output

    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     

    Sample Input

    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
     

    Sample Output

    3 2
     
    tip:有两种算法,floyd和Dijkstra自己还不是怎么熟练,用的比较简单的F
    伪代码就是dis[a][b]=dis[b][a];
         for(int k=1;k<=n;k++)
            {
                for(int i=1;i<=n;i++)
                {
                    for(int j=1;j<=n;j++)
                    {
                        if(dis[i][j]>dis[i][k]+dis[k][j])
                        {
                            dis[i][j]=dis[i][k]+dis[k][j];
                        }
                    }
                }
            }
     
     
     1 #include<iostream>///flyod
     2 #include<cstdio>
     3 #include<climits>
     4 
     5 using namespace std;
     6 
     7 const int INF=INT_MAX/2;
     8 int dis[105][105];
     9 
    10 int main()
    11 {
    12     int n,m;
    13     while(scanf("%d %d",&n,&m)!=EOF&&n+m)
    14     {
    15         for(int i=1;i<=n;i++)
    16         {
    17             for(int j=1;j<=n;j++)
    18             {
    19                 dis[i][j]=INF;
    20             }
    21         }
    22 
    23         int a,b,c;
    24         for(int i=0;i<m;i++)
    25         {
    26             scanf("%d %d %d",&a,&b,&c);
    27             dis[a][b]=dis[b][a]=c;
    28         }
    29 
    30         for(int k=1;k<=n;k++)///k个路口
    31         {
    32             for(int i=1;i<=n;i++)
    33             {
    34                 for(int j=1;j<=n;j++)
    35                 {
    36                     if(dis[i][j]>dis[i][k]+dis[k][j])
    37                     {
    38                         dis[i][j]=dis[i][k]+dis[k][j];
    39                     }
    40                 }
    41             }
    42         }
    43 
    44         cout<<dis[1][n]<<endl;
    45     }
    46     return 0;
    47 }


    dijkstra算法:

    void Dijkstra(int n,int x)

    {  

      int i,p,j,min;

      for(i=1;i<=n;i++)///到起始点的距离

      {   

        dis[i]=map[1][i];   

        visited[i]=0;  

      }  

      visited[x]=1;///表示来过

      for(i=1;i<=n;i++)///遍历每个点  

      {   

        min=INF;   

        for(j=1;j<=n;j++)///枚举中间有的点   

        {    

          if(!visited[j]&&dis[j]<min)///如果没有来过,而且距离还小,那就更新    

          {     

             p=j;     

             min=dis[j];    

          }   

        }   

        visited[p]=1;

        for(j=1;j<=n;j++)///更新每个点   

        {    

          if(!visited[j]&&dis[p]+map[p][j]<dis[j])///到p的距离+到j的距离小于直接到j的距离——》更新    

          {                

            dis[j]=dis[p]+map[p][j];    

          }   

        }  

      }

    }

     1 #include<iostream>///Dijkstra
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<climits>
     5 
     6 using namespace std;
     7 
     8 #define INF INT_MAX;
     9 
    10 int map[110][110],dis[110],visited[110];
    11 
    12 void Dijkstra(int n,int x)
    13 {
    14     int i,p,j,min;
    15 
    16     for(i=1;i<=n;i++)
    17     {
    18         dis[i]=map[1][i];
    19         visited[i]=0;
    20     }
    21     visited[x]=1;
    22 
    23     for(i=1;i<=n;i++)
    24     {
    25         min=INF;
    26         for(j=1;j<=n;j++)
    27         {
    28             if(!visited[j]&&dis[j]<min)
    29             {
    30                 p=j;
    31                 min=dis[j];
    32             }
    33         }
    34         visited[p]=1;
    35 
    36         for(j=1;j<=n;j++)
    37         {
    38             if(!visited[j]&&dis[p]+map[p][j]<dis[j])
    39             {
    40                 dis[j]=dis[p]+map[p][j];
    41             }
    42         }
    43     }
    44 
    45 }
    46 
    47 int main()
    48 {
    49     int n,m,i,j,a,b,t;
    50     while(scanf("%d%d",&n,&m)!=EOF,n+m)
    51     {
    52 
    53         for(i=1;i<=n;i++)
    54         {
    55             for(j=1;j<=n;j++)
    56             {
    57                 map[i][j]=INF;
    58             }
    59         }
    60 
    61         for(i=1;i<=m;i++)
    62         {
    63             scanf("%d%d%d",&a,&b,&t);
    64             map[a][b]=map[b][a]=t;
    65         }
    66 
    67         Dijkstra(n,1);
    68         printf("%d
    ",dis[n]);
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    Openssl自签发SSL证书
    营业执照信息识别
    kubernetes容器编排YAML详解
    drf的序列化
    K8S存储
    身份证信息识别
    6.Stream
    11.17个提升开发效率的“轮子”
    1.中台
    8.函数式接口
  • 原文地址:https://www.cnblogs.com/moqitianliang/p/4682239.html
Copyright © 2020-2023  润新知