PTA 旅游规划(25 分)
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 分)的更多相关文章
- PTA 07-图6 旅游规划 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划 (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...
- PAT 07-图6 旅游规划 (25分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...
- 【(图) 旅游规划 (25 分)】【Dijkstra算法】
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...
- PTA 列车调度 (25分)
PTA 列车调度 (25分) [程序实现] #include<bits/stdc++.h> using namespace std; int main(){ int num,n; cin& ...
- PTA 朋友圈 (25 分) 代码详解 (并查集)
1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...
- PTA 5-12 排序 (25分)
给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果. 本题旨在测试各种不同的排序算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:只有1个元素: 数据2:11个不相同的整数,测试 ...
- pat06-图5. 旅游规划(25)
06-图5. 旅游规划(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该 ...
- PTA 7-10(图) 旅游规划 最短路问题
7-10(图) 旅游规划 (25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果 ...
- PTA 11-散列3 QQ帐户的申请与登陆 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/723 5-15 QQ帐户的申请与登陆 (25分) 实现QQ新帐户申请和老帐户登陆的简 ...
随机推荐
- JAVA工程师面试题【来自并发编程网】
基础题: Java线程的状态 进程和线程的区别,进程间如何通讯,线程间如何通讯 HashMap的数据结构是什么?如何实现的.和HashTable,ConcurrentHashMap的区别 Cookie ...
- Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装
1.写在前面 最近在学习Vue2,遇到有些页面请求数据需要用户登录权限.服务器响应不符预期的问题,但是总不能每个页面都做单独处理吧,于是想到axios提供了拦截器这个好东西,再于是就出现了本文. 2. ...
- SpringBoot单元测试中的事务和Session
1.Springboot中使用junit编写单元测试,并且测试结果不影响数据库. 2.
- Oracle12c在Win10上的安装配置实践
1.环境 操作系统:Win10专业版(64位) 数据库:Oracle 12c Release 2(Version 12.2.0.1.0,64位) 2.下载Oracle12c oracle官网下载地址: ...
- python JavaScript
JavaScript 一. JavaScript Javascript 在开发中绝大多数情况是基于对象的.也是面向对象的. a. JavaScript的引入方式 1 2 3 4 5 6 7 #直接编写 ...
- Linux:crontab组件部署linux定时任务
crontab简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动c ...
- C# QQ & 163 邮件发送
这篇文章的目的并不是说明如果进行右键的发送,因为在.net 坝坝的怀抱下邮件发送的功能实现并不会很难,当然邮件发送的代码,还是会贴上的,昨天在写一个邮件发送的功能,我直接找到了原来的代码,想着直接就可 ...
- python的错误处理
一.python的错误处理 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错以及出错的原因. 在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数o ...
- iframe 里的高度适应的问题
iframe 这个东西功能是很强大,但是有一个巨大的问题就是高度自适应的问题: 不过这个问题,百度或者谷歌上有很多解决办法,但是,很多时候都有兼容性问题: 所有我就每个方法都试了一遍,终于找到了一个 ...
- java中lamda表达式的应用
lamda表达式主要是为了解决匿名内部类的繁琐过程 范例:简单的lamda表达式 此处使用匿名内部类 package com.java.demo; interface IMessage{ public ...