7-10 旅游规划(25 分)

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

输入格式:

输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);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

#include<bits/stdc++.h>
using namespace std;
#define maxn 0x7fffffff
int mat[505][505],vis[505],pay[505][505];
/*
mat 是图的邻接矩阵表示,vis是标记数组 , pay 是花费的邻接矩阵表示
*/
int dis[505],cost[505],n,m,path[505];  //最短路 + 路径输出
//n 是点的个数 标记为 0 ~ n-1 ,
//dis 最短路记录数组,cost 最小花费记录数组,path 路径记录数组
void dijkstra(int s) //修改后的最短路算法,+path 记录 和 花费计算
{
  int i,j;
  memset(vis,0,sizeof(vis));//清空标记数组
  for(i=0;i<n;i++)
  {
      /*
      用mat临接矩阵的值初始化dis 的值
      用pay临接矩阵的值初始化cost 的值
      */
      dis[i]=mat[s][i];
      cost[i]=pay[s][i];
      if(dis[i]!=maxn) //无穷大代表此路不通 path[i] =-1,否则就在路径加入这个点
          path[i]=s;
      else path[i]=-1;
  }
  vis[s]=1;//起始点标记
  dis[s]=0;//自己到自己的花费cost = 0
  cost[s]=0;
  for(i=1;i<n;i++)
  {
      int k=s,u=maxn;
      /*
      找出到s距离最短&没标记的点,作为中转点更新dis值
      */
      for(j=0;j<n;j++)
      {
          if(!vis[j]&&dis[j]<u)
          {
              u=dis[j];
              k=j;
          }
      }
      vis[k]=1;//标记这个点
      for(j=0;j<n;j++)
      {
          if(!vis[j]&&mat[k][j]!=maxn)
          {
              /*
              用这个点更新dis值,cost 和 dis同步更新,参数值相同
              如果把k作为中转点成功缩减了dis值,就让k点加入path路径里
              */
              if(dis[j]>dis[k]+mat[k][j])
              {
                  dis[j]=dis[k]+mat[k][j];
                  cost[j]=cost[k]+pay[k][j];
                  path[j]=k;
              }
              /*
              最短路径dis相同的话,选择花费最少的,最小cost
              */
              else if(dis[j]==dis[k]+mat[k][j])
              {
                  /*
                  如果这个花费更加优,那么把这个点加入,更新最优秀的路径
                  最后path里面记录的是最优路径
                  */
                  if(cost[j]>cost[k]+pay[k][j])
                  {
                      cost[j]=cost[k]+pay[k][j];
                      path[j]=k;
                  }
              }
          }
      }
  }
}
void print(int s,int t)
{
    stack<int>q;
    /*
    从path里溯源t = path[t],返回上一个和t联通的路径,由后往前,把s~t路径放入队列里面,然后输出
    */
    while(t!=s)
    {
        q.push(t);
        t=path[t];
    }
    q.push(t);
    while(!q.empty())
    {
        cout<<q.top()<<" ";
        q.pop();
    }
}
int main()
{
    int s,t,a,b,d,w,i,j;
    cin>>n>>m>>s>>t;
    for(i=0;i<n;i++)
       for(j=0;j<n;j++)
          mat[i][j]=pay[i][j]=maxn;
    /*
    初始化数组,让距离邻接矩阵数组值 = 无穷大,花费邻接矩阵的值 = 无穷大
    这个计算方式对无向图和有向图同样适用,只需要部分修改
    */
    for(i=0;i<m;i++)
    {
        cin>>a>>b>>d>>w;
        if(mat[a][b]>d)
        {
            mat[a][b]=mat[b][a]=d;
            pay[a][b]=pay[b][a]=w;
        }
        else if(mat[a][b]==d)
        {
            if(pay[a][b]>w)
               pay[a][b]=pay[b][a]=w;
        } // 输入进行处理,最短路
    }
    dijkstra(s); // 寻找从 s 开始 单源最短路
   // print(s,t);// 输出路径, S 到 T 的路径
    cout<<dis[t]<<" "<<cost[t]<<endl;  // dist 指的是 距离 dis[t] 指的是花费
    return 0;
}

  

PTA 旅游规划(25 分)的更多相关文章

  1. PTA 07-图6 旅游规划 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划   (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...

  2. PAT 07-图6 旅游规划 (25分)

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

  3. 【(图) 旅游规划 (25 分)】【Dijkstra算法】

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...

  4. PTA 列车调度 (25分)

    PTA 列车调度 (25分) [程序实现] #include<bits/stdc++.h> using namespace std; int main(){ int num,n; cin& ...

  5. PTA 朋友圈 (25 分) 代码详解 (并查集)

    1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...

  6. PTA 5-12 排序 (25分)

    给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果. 本题旨在测试各种不同的排序算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:只有1个元素: 数据2:11个不相同的整数,测试 ...

  7. pat06-图5. 旅游规划(25)

    06-图5. 旅游规划(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该 ...

  8. PTA 7-10(图) 旅游规划 最短路问题

    7-10(图) 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果 ...

  9. PTA 11-散列3 QQ帐户的申请与登陆 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/723 5-15 QQ帐户的申请与登陆   (25分) 实现QQ新帐户申请和老帐户登陆的简 ...

随机推荐

  1. java图片处理开源框架

    java图片处理开源框架 以前一直不明白,java开源框架什么意思,搜集资料得出以下结论 其实java框架可以理解为一个工具或者一个插件,将一个公用的.常用的技术封装起来,处理一些基础的.繁琐的问题. ...

  2. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  3. Connect Appium Server Fail.A new session could not be created

    1.由于安卓测试机性能低下,并不能支持测试工作,想安装一个模拟器帮助测试,然后发现群里有朋友发了一个夜神模拟器..下载..安装..美滋滋的准备运行脚本.What..居然报错了..orz..然后百度查找 ...

  4. hadoop大数据技术架构详解

    大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展.高效率.高可靠等优点越来越受到欢迎.这同时也带动了 ...

  5. WPF 自定义RadioButton样式

    一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...

  6. React Native学习(九)—— 使用Flexbox布局

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  7. SSH 配置

    ssh免密通用配置 Host * Port 1234 User root #ProxyCommand nc -X 5 -x 127.0.0.1:1081 %h %p #5 socks5, 4 sock ...

  8. loadrunner录制时web时,安全证书问题

    测试环境:win7+LoadRunner11+ie9 遇到的问题:用LoadRunner录制时,打开百度,总是报安全证书问题,如图所示 解决方法:Tools——Recording Options——p ...

  9. python实现归并排序,归并排序的详细分析。

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...

  10. Android 自定义控件高度设置onMeasure方法

    最近使用hellocharts需要表格横向显示,而activity需要竖屏显示,在旋转以后,默认宽度为不超过屏幕宽度,则一直无法显示全控件. 此时需要修改onMeasure方法,这个方法是用来控制控件 ...