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 ...
随机推荐
- Educational Codeforces Round 86 (Div. 2)
比赛链接:https://codeforces.com/contest/1342 A - Road To Zero 题意 有两个非负整数 x, y 以及两种操作: 支付 a 点代价使其中一个数加一或减 ...
- Codeforces Round #582 (Div. 3) E. Two Small Strings (构造,思维,全排列)
题意:给你两个长度为\(2\)的字符串\(s\)和\(t\),你需要构造一个长度为\(3n\)的字符串,满足:含有\(n\)个\(a\),\(n\)个\(b\),\(n\)个\(c\),并且\(s\) ...
- HTTP笔记1--Web及网络基础
web页面如何呈现? 客户端:通过发送请求获取服务器资源的 Web 浏览器 web是建立在 HTTP 协议上通信的 WWW(万维网/web)的构建技术 把 SGML(StandardGeneral ...
- echart关系图平分节点删除时自动平衡问题
项目场景: 项目场景:Echarts关系图中(不是力图)一个节点x,y是固定的,为了同一列能居中显示,规定:当前列有奇数个元素新节点往下放,有偶数个节点时新节点往上放. 问题描述: 删除中间节点会有空 ...
- LINUX - 随机数
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h& ...
- c# 类(4)
原文链接:https://csharp.net-tutorials.com/classes/visibility/ 可见性 Visibility 可见性 控制的是 访问权限的问题.最常见的就是priv ...
- 9. Lock wait timeout exceeded
一. 现象 用户打开消息推送有概率报错,后续发现推送消息阅读数.点赞数无法正常更新,mysql报警有行锁, DBA抓到有锁表语句,kill该语句未正常恢复,elk日志有大量的java.sql.SQLE ...
- certbot 获取数字证书失效问题
title: certbot 获取数字证书失效问题 author: Narule date: 2021-02-18 10:45:00 +0800 categories: [Technology^技术, ...
- 网站备案查询/ICP备案查询网
网站备案查询/ICP备案查询网 互联网站备案信息全国公安机关互联网站安全服务平台http://www.beian.gov.cn/portal/index 1 http://www.miitbeian. ...
- Swift private(set) All In One
Swift private(set) All In One SwiftUI Getters and Setters https://docs.swift.org/swift-book/Language ...