1018 Public Bike Management (30分) (迪杰斯特拉+dfs)
思路就是dijkstra找出最短路,dfs比较每一个最短路。
dijkstra可以找出每个点的前一个点, 所以dfs搜索比较的时候怎么处理携带和带走的数量就是关键,考虑到这个携带和带走和路径顺序有关,所以可以用下面的写法,看代码就可以了。
最开始的时候是想用一个偏动态规划的写法做,但是因为题目的显示,既要带去的车数量最少,又要求从一个点带走的车数量最少,所以如果过动规的话,对于一个点的多个最短路,就会选择带去数量最少,带走车数最少的路径,但是如果这个点后面的点的车辆数少一标准量的一半的话,前面带的是最少的,这样相当于携带的车的数量就多了,这样就矛盾了。
当时挺纠结的,因为只写过一道类型的题,还是用动规的写法写的,那个权值只有两个,也是pat的题,这个主要是权值矛盾了, 所以不能用动规的思想写。
#include <bits/stdc++.h>
using namespace std;
const int maxn=505;
const int INF=0x3f3f3f3f;
int g[maxn][maxn];
vector<int> pre[maxn];
int C,N,M,SP;
int vis[maxn],num[maxn],d[maxn];
void dijkstra()
{
d[0]=0;
for (int i=0;i<N;i++) {
int u=-1,tmp=INF;
for (int j=0;j<=N;j++) {
if (!vis[j]&&d[j]<tmp) {
tmp=d[j];
u=j;
}
}
if (u==-1) break;
vis[u]=1;
for (int j=0;j<=N;j++) {
if (j==u) {
continue;
}
if (d[u]+g[u][j]<d[j]) {
d[j]=d[u]+g[u][j];
pre[j].clear();
pre[j].push_back(u);
}
else if (d[u]+g[u][j]==d[j]) {
pre[j].push_back(u);
}
}
}
}
int path[maxn],acnt=0;
int ansn=INF,anst=INF,ansp[maxn];
void dfs(int u,int need,int take,int cnt)
{
path[cnt]=u;
if (u==0) {
// for (int i=0;i<cnt;i++) {
// printf("%d ",path[i]);
// }
// puts("");
// printf("need %d take %d\n",need,take);
if (need<ansn) {
ansn=need;
anst=take;
acnt=cnt;
for (int i=0;i<cnt;i++) {
ansp[i]=path[i];
}
}
else if (need==ansn) {
if (take<anst) {
anst=take;
acnt=cnt;
for (int i=0;i<cnt;i++) {
ansp[i]=path[i];
}
}
}
return ;
}
if (num[u]==C/2) {}
else if (num[u]>C/2) {
if (need>0) {
if (num[u]-C/2>=need) {
take+=num[u]-C/2-need;
need=0;
}
else need-=num[u]-C/2;
}
else take+=num[u]-C/2;
}
else need+=C/2-num[u];
int sz=pre[u].size();
for (int i=0;i<sz;i++) {
dfs(pre[u][i],need,take,cnt+1);
}
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&C,&N,&SP,&M);
for (int i=1;i<=N;i++) {
scanf("%d",&num[i]);
}
memset(g,INF,sizeof(g));
for (int i=0;i<=N;i++) {
g[i][i]=0;
d[i]=INF;
}
int u,v,c;
for (int i=0;i<M;i++) {
scanf("%d%d%d",&u,&v,&c);
g[u][v]=c;
g[v][u]=c;
}
dijkstra();
// for (int i=1;i<=N;i++) {
// printf("%d ",d[i]);
// }
// puts("");
// for (int i=1;i<=N;i++) {
// printf("%d:\n",i);
// for (int j=0;j<pre[i].size();j++) {
// printf("%d ",pre[i][j]);
// }
// printf("\n");
// }
dfs(SP,0,0,0);
printf("%d %d",ansn,0);
for (int i=acnt-1;i>=0;i--) {
printf("->%d",ansp[i]);
}
printf(" %d\n",anst);
return 0;
}
1018 Public Bike Management (30分) (迪杰斯特拉+dfs)的更多相关文章
- 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 ...
- 1018 Public Bike Management (30 分)
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- 1018 Public Bike Management (30分) 思路分析 + 满分代码
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
- 1018 Public Bike Management (30分) PAT甲级真题 dijkstra + dfs
前言: 本题是我在浏览了柳神的代码后,记下的一次半转载式笔记,不经感叹柳神的强大orz,这里给出柳神的题解地址:https://blog.csdn.net/liuchuo/article/detail ...
- 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)
题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...
- 1018 Public Bike Management (30)(30 分)
时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...
- 1018. Public Bike Management (30)
时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...
- 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 (30) Dijkstra算法 + DFS
题目及题解 https://blog.csdn.net/CV_Jason/article/details/81385228 迪杰斯特拉重新认识 两个核心的存储结构: int dis[n]: //记录每 ...
随机推荐
- 洛谷P1170 兔八哥与猎人 欧拉函数的应用
https://www.luogu.org/problem/P1170 #include<bits/stdc++.h> using namespace std; ],b[],c[],d[] ...
- jupyter快捷键使用
1. 服务启动与停止 环境为windows10系统 ctrl+R输入cmd,输入命令jupyter notebook启动 使用Control-c停止服务 2.常用快捷键 模式切换 当前cell侧边为蓝 ...
- pytest学习1-安装和入门
一.安装pytest: 在命令行窗口下执行: pip install -U pytest 检查安装的pytest版本: pytest -v 二.运行第一个测试用例: import pytest def ...
- Javaweb项目不需要端口号及项目名的访问配置(已备注)
1.不需要端口号的配置: 在server.xml中找到节点: <Connector URIEncoding="UTF-8" connectionTimeout="2 ...
- vue的$on,$emit
使用 $on(eventName) 监听事件使用 $emit(eventName) 触发事件 Api 中的解释: vm.$emit( event, […args] ) 参数: {string} eve ...
- Android开发模拟器(虚拟机)的连接等操作
前10天一直在解决android开发环境的问题,我将Androidstudio下载并安装好之后,进入IDE之后,下载AVDmanger中的虚拟机以及SDK等等.之后发现并不能运行虚拟机,根本无法打开虚 ...
- C++-HDU1394-Minimum Inversion Number[数据结构][树状数组]
给出0~n-1的一个排列,可以整体移动,求逆序对最小值 把数字num[i]的加入,等价于树状数组的第n-num[i]位加1 因为num[i]是第 (n-1)-num[i]+1=n-num[i]大的数字 ...
- anaconda+pytorch安装(无GPU版本)
anaconda+pytorch安装(无GPU版本) 待办 https://blog.csdn.net/nnUyi/article/details/78471326
- 8.1.1 IO
IO对象无拷贝或赋值.进行IO操作的函数通常以引用的方式传递和返回流,且该引用不能是const的 确定一个流对象是否处于良好状态的最简单的方法是将它作为一个条件来使用 while (cin >& ...
- 题解【SP2713】GSS4 - Can you answer these queries IV
题目描述 You are given a sequence \(A\) of \(N(N \leq 100,000)\) positive integers. There sum will be le ...