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 ...
随机推荐
- GCD HDU - 1695 容斥原理(复杂度低的版本)
题意: 让你从区间[a,b]里面找一个数x,在区间[c,d]里面找一个数y.题目上已经设定a=b=1了.问你能找到多少对GCD(x,y)=k.x=5,y=7和y=5,x=7是同一对 题解: 弄了半天才 ...
- codeforces Looksery Cup 2015 C. The Game Of Parity
There are n cities in Westeros. The i-th city is inhabited by ai people. Daenerys and Stannis play t ...
- Linux系统编程【1】——编写more命令
背景介绍 笔者知识背景 笔者接触Linux快一年了.理论知识方面:学习了操作系统基础知识,了解进程调度.内存分配.文件管理.磁盘I/O这些基本的概念. 实操方面:会使用Linux简单命令,在嵌入式系统 ...
- C# 静态类 单例模式 对比
公司的类都需要使用单例模式实现,这个可以节省资源,避免重复对象的生成.但是静态类也可以做到这一点,而且写起来更简洁,于是查阅相关资料,希望弄明白两者的差别. 1.单例模式可以在用到的时候初始化,而静态 ...
- .Net Core 国际化
创建项目什么的就不说了吧 直接进入正题吧 我这里建的是个webapi 添加资源文件 1.首先我们创建一个Language文件夹,这就是我们在后面Startup类中需要配置的目录名. 2.然后我们在La ...
- javascript输出数据到文件
function export(name, data) { var urlObject = window.URL || window.webkitURL || window var export_bl ...
- 使用opencv-python实现MATLAB的fspecial('Gaussian', [r, c], sigma)
reference_opencv实现高斯核 reference_MATLAB_fspecial函数说明 # MATLAB H = fspecial('Gaussian', [r, c], sigma) ...
- 微信公众号代码高亮美化工具 All In One
微信公众号代码高亮美化工具 All In One markdown 美化 mdnice 编辑器 https://www.mdnice.com/ https://github.com/mdnice ma ...
- Learning Web Performance with MDN
Learning Web Performance with MDN Web 性能是客观的衡量标准,是加载时间和运行时的感知用户体验. https://developer.mozilla.org/en- ...
- Axios 取消 Ajax 请求
Axios 取消 Ajax 请求 Axios XMLHttpRequest https://caniuse.com/?search=XMLHttpRequest https://developer.m ...