• PTA 7-9 旅游规划(SPFA)


    有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

    输入格式:

    输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2N500)是城市的个数,顺便假设城市的编号为0~(N1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

    输出格式:

    在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

    输入样例:

    4 5 0 3
    0 1 1 20
    1 3 2 30
    0 3 4 10
    0 2 2 20
    2 3 1 20
    

    输出样例:

    3 40

    题意

    求从s点出发到d点的最短路并且最小花费

    题解

    单源最短路,考虑Dijstra(优化)和SPFA,这里选用SPFA

    求最短路不用说

    求最小花费,如果到某点的长度相等,更新花费就行了

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N=505,M=N*N,INF=0x3f3f3f3f;
     5 int Vis[N],Dist[N],C[N];
     6 int Cost[N][N],G[N][N];
     7 int n,m,s,d;
     8 void spfa()
     9 {
    10     memset(Dist,INF,sizeof(Dist));
    11     queue<int> Q;
    12     Q.push(s);
    13     Dist[s]=0;
    14     while(!Q.empty())
    15     {
    16         int u=Q.front();Q.pop();
    17         Vis[u]=0;
    18         for(int v=0;v<=n;v++)
    19         {
    20             if(u!=v&&G[u][v]!=1e9)
    21             {
    22                 if(Dist[v]>Dist[u]+G[u][v])//最短路
    23                 {
    24                     Dist[v]=Dist[u]+G[u][v];
    25                     C[v]=C[u]+Cost[u][v];//如果更新了最短路,花费直接更新
    26                     if(!Vis[v])
    27                     {
    28                         Q.push(v);
    29                         Vis[v]=1;
    30                     }
    31                 }
    32                 else if(Dist[v]==Dist[u]+G[u][v])//最短路相同
    33                 {
    34                     if(C[v]>C[u]+Cost[u][v])//最小花费
    35                     {
    36                         C[v]=C[u]+Cost[u][v];
    37                         if(!Vis[v])
    38                         {
    39                             Q.push(v);
    40                             Vis[v]=1;
    41                         }
    42                     }
    43                 }
    44             }
    45         }
    46     }
    47     printf("%d %d
    ",Dist[d],C[d]);
    48 }
    49 int main()
    50 {
    51     int u,v,w,t;
    52     scanf("%d%d%d%d",&n,&m,&s,&d);
    53     for(int i=0;i<=n;i++)
    54         for(int j=0;j<=n;j++)
    55             if(i==j)G[i][j]=Cost[i][j]=0;
    56             else G[i][j]=Cost[i][j]=1e9;
    57     for(int i=0;i<m;i++)
    58     {
    59         scanf("%d%d%d%d",&u,&v,&w,&t);
    60         Cost[v][u]=Cost[u][v]=t;
    61         G[v][u]=G[u][v]=w;
    62     }
    63     spfa();
    64     return 0;
    65 }
  • 相关阅读:
    Thread.Join
    WPF几个基础概念的浅显理解
    Vue v-bind指令
    Vue设置路由跳转的两种方法: <router-link :to="..."> 和router.push(...)
    前端上传视频、图片、文件等大文件 组件Plupload使用指南
    vue如何获取并操作DOM元素
    css中border-sizing属性详解和应用
    vue使用axios发送post请求时的坑及解决原理
    vue中的js引入图片,使用require相关问题
    vue 动态添加body背景图片
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8548225.html
Copyright © 2020-2023  润新知