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算法的更多相关文章

  1. PAT 1018 Public Bike Management[难]

    链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018  Public ...

  2. PAT 1018 Public Bike Management(Dijkstra 最短路)

    1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  3. PAT 1018. Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  4. PAT甲级1018. Public Bike Management

    PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...

  5. 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 ...

  6. 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 ...

  7. 1018 Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  8. 1018 Public Bike Management (30)(30 分)

    时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...

  9. pat 甲级 Public Bike Management

    Public Bike Management (30) 题目描述 There is a public bike service in Hangzhou City which provides grea ...

随机推荐

  1. zjnu1762 U (线段树)

    Description Mirko is hungry as a bear, scratch that, programmer and has stumbled upon a local restau ...

  2. UVA442 矩阵链乘 Matrix Chain Multiplication

    题意: 这道题也是在不改变原序列每个元素位置的前提下,看每个元素与他身边的两个元素那个先结合能得到最大的能量 题解: 很明显这是一道区间dp的题目,这道题要断环成链,这道题需要考虑在这个区间上某个元素 ...

  3. hdu5391 Zball in Tina Town

    Problem Description Tina Town is a friendly place. People there care about each other. Tina has a ba ...

  4. Codeforces Round #651 (Div. 2) A. Maximum GCD (思维)

    题意:在\(1\)~\(n\)中找两个不相等的数使得他们的\(gcd\)最大. 题解:水题,如果\(n\)是偶数,那么一定取\(n\)和\(n/2\),\(n\)是奇数的话,取\(n-1\)和\((n ...

  5. Linux 设置简单密码

    centos: echo 密码 | passwd --stdin 用户名 ubuntu:(需先设置一个密码) sudo passwd username https://blog.csdn.net/mi ...

  6. Pyqt5使用

    一.帮助文档 二.PyQt5库结构 三. 面向对象的编程模式 class Windows(QWidget): def __init__(self): #继承父类的QWidget的方法 super(). ...

  7. Redis Cluster 分布式集群(下)

    Redis Cluster 搭建(工具) 环境准备 节点 IP 端口 节点① 172.16.1.121 6379,6380 节点② 172.16.1.122 6379,6380 节点③ 172.16. ...

  8. IOS键盘收起后,页面底部留白处理

    环境:vue+vant 的H5页面 场景:输入框输入信息时,如登录.注册等表单信息 问题:键盘收回后页面底部留白,导致dialog组件按钮位移,视觉上,其中的按钮无法正常工作 解决方案:监听失去焦点时 ...

  9. Redis-第八章节-应用场景

    目录 概述 详解 1.概述 Redis支持五种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合). 2.详解 1.String(字符串) 定义: ...

  10. Inkscape tricks

    Draw straight lines: click pencil button -> click once on your canvas(starting point) -> click ...