PAT-1018(Public Bike Management)最短路+额外条件+所有最短路中找出满足条件的路径+dijkstra算法
Public Bike Management
PAT-1018
- 使用一个vector来存储所有最短路的前驱结点,再通过使用dfs和一个额外的vector记录每一条路径
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=502;
const int maxm=250004;
const int INF=0X3F3F3F3F;
int cmax,n,m,pi;
int ci[maxn];
int head[maxn];
int top;
int d[maxn];
vector<int>pre[maxn];//记录路径也就是前驱结点
int minneed=INF,minback=INF;
int temp;//当前收集了多少单车数量
vector<int>tempve;
vector<int>path;//真正符合题意的路径
struct Edge{
int to,cost,next;
};
Edge edge[maxm];
struct Node{
int to,dis;
Node(){
}
Node(int a,int b):to(a),dis(b){
}
bool operator<(const Node& node)const{
return dis>node.dis;//从大到小排序,越小的元素优先级越高
}
};
void dijkstra(int s){
priority_queue<Node>que;
que.push(Node(s,0));
for(int i=0;i<=n;i++){
d[i]=INF;
}
d[s]=0;
while(!que.empty()){
Node now=que.top();
que.pop();
int to=now.to;
int dis=now.dis;
if(d[to]<dis)
continue;
for(int i=head[to];i!=-1;i=edge[i].next){
Edge e=edge[i];
if(d[e.to]>d[to]+e.cost){
d[e.to]=d[to]+e.cost;
que.push(Node(e.to,d[e.to]));
pre[e.to].clear();
pre[e.to].push_back(to);
}else if(d[e.to]==d[to]+e.cost){
// que.push(Node(e.to,d[e.to]));
pre[e.to].push_back(to);
}
}
}
}
void dfs(int v){
if(v==0){//调度中心
tempve.push_back(v);
int takefrom=0,takeback=0;
for(int i=tempve.size()-1;i>=0;i--){//从起点开始遍历
int id=tempve[i];
// cout<<id<<" ";
if(ci[id]>0){//ci[id]>5
takeback+=ci[id];
} else{
if(takeback>-ci[id]){
takeback+=ci[id];
}else{
takefrom+=(-ci[id]-takeback);//缺失的比需要带回的更多
takeback=0;
}
}
}
// cout<<endl;
if(takefrom<minneed){
minneed=takefrom,minback=takeback,path=tempve;
}else if(takefrom==minneed&&takeback<minback){
minback=takeback,path=tempve;
}
tempve.pop_back();
return;
}
tempve.push_back(v);
for(int i=0;i<pre[v].size();i++){
dfs(pre[v][i]);
}
tempve.pop_back();
}
void addEdge(int a,int b,int c){
edge[top].to=b;
edge[top].cost=c;
edge[top].next=head[a];
head[a]=top++;
}
int main(){
top=0;
memset(head,-1,sizeof(head));
cin>>cmax>>n>>pi>>m;
for(int i=1;i<=n;i++){
cin>>ci[i];
ci[i]-=cmax/2;
}
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
addEdge(a,b,c);
addEdge(b,a,c);
}
dijkstra(0);
dfs(pi);
reverse(path.begin(),path.end());
cout<<minneed<<" ";
for(int i=0;i<path.size();i++){
if(i==(int)path.size()-1){
cout<<path[i]<<" ";
}else cout<<path[i]<<"->";
}
cout<<minback<<endl;
return 0;
}
PAT-1018(Public Bike Management)最短路+额外条件+所有最短路中找出满足条件的路径+dijkstra算法的更多相关文章
- PAT 1018 Public Bike Management[难]
链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018 Public ...
- PAT 1018 Public Bike Management(Dijkstra 最短路)
1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- PAT 1018. Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- PAT甲级1018. Public Bike Management
PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...
- PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)
1018 Public Bike Management (30 分) There is a public bike service in Hangzhou City which provides ...
- PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
- 1018 Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- 1018 Public Bike Management (30)(30 分)
时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...
- pat 甲级 Public Bike Management
Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...
随机推荐
- 1561: (More) Multiplication
Description Educators are always coming up with new ways to teach math to students. In 2011, an educ ...
- 通过k8s部署dubbo微服务并接入ELK架构
需要这样一套日志收集.分析的系统: 收集 -- 能够采集多种来源的日志数据 (流式日志收集器) 传输 -- 能够稳定的把日志数据传输到中央系统 (消息队列) 存储 -- 可以将日志以结构化数据的形式存 ...
- 使用SignTool对软件安装包进行数字签名(一)--制作证书
一.制作根证书 1.开始菜单-运行-输入cmd,弹出命令行窗体. 2.输入命令:cd /d F:\SignTool,将当前工作目录修改到SignTool路径下. 3.使用makecert命令制作证书, ...
- 4.Redis客户端的使用
标题 : 4.Redis客户端的使用 目录 : Redis 序号 : 4 Console.WriteLine($"北京和天津之间的距离是:{distance}公里"); #### ...
- oslab oranges 一个操作系统的实现 实验四 认识保护模式(三):中断异常
实验目的: 理解中断与异常机制的实现机理 对应章节:第三章3.4节,3.5节 实验内容: 1. 理解中断与异常的机制 2. 调试8259A的编程基本例程 3. 调试时钟中断例程 4. 建立IDT,实现 ...
- Leetcode(35)-搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 这个题目很简单,因为它是给定的排序数组而且没有重 ...
- 从.NET看微软的焦虑
节日没事,就像聊聊微软的NET. 1.孩子静悄悄,必定在作妖 截止目前,微软的市值达到1.85万亿美元,按说,这样一个宙斯级的巨无霸应该过的非常舒坦, 但是,和微软市值成鲜明的反差,我们从.NET的发 ...
- React Hooks vs React Class vs React Function All In One
React Hooks vs React Class vs React Function All In One React Component Types React Hooks Component ...
- JavaScript Number Type Checker
JavaScript Number Type Checker Number.isInteger // static 方法 Number.isInteger(value) https://develop ...
- Markdown & Static Site Generator
Markdown & Static Site Generator https://www.gitbook.com/ https://vuepress.vuejs.org/ https://ww ...