PAT A1018
A 1018 Public Bike Management
这个题目算是比较典型的一个。我分别用dfs,及dijkstra+dfs实现了一下。
dfs实现代码:
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define MAXNUM 510
#define CLR(a,b) memset(a,b,sizeof(a));
const int INF = 0x7f7f7f7f;
int C, N, Sp, M, dstDis = INF, tmpDstDis = , dstSendBikeNum = INF, dstBackBikeNum = INF;
vector<int> dstPathVec, tmpPathVec, routeVec[MAXNUM];
vector<int> bikeNumStaVec(MAXNUM,);
vector<int> visitFlagVec(MAXNUM,false);
int route[MAXNUM][MAXNUM];
void dfs(int u)
{
if(u == Sp && tmpDstDis <= dstDis)
{
int halfC = C/, tmpBikeNum = , tmpSendBikeNum = , tmpBackBikeNum = ;
for(int i = ; i < tmpPathVec.size(); ++ i)
{
tmpBikeNum += halfC-bikeNumStaVec[tmpPathVec[i]];
if(tmpBikeNum > )
{
tmpSendBikeNum += tmpBikeNum;
tmpBikeNum = ;
}
}
tmpBackBikeNum = -tmpBikeNum;
if(tmpDstDis < dstDis)
{
dstSendBikeNum = tmpSendBikeNum;
dstBackBikeNum = tmpBackBikeNum;
dstDis = tmpDstDis;
dstPathVec = tmpPathVec;
}
else if((tmpSendBikeNum < dstSendBikeNum) || (dstSendBikeNum == tmpSendBikeNum && dstBackBikeNum > tmpBackBikeNum))
{
dstSendBikeNum = tmpSendBikeNum;
dstBackBikeNum = tmpBackBikeNum;
dstDis = tmpDstDis;
dstPathVec = tmpPathVec;
}
return;
}
if(tmpDstDis > dstDis)
return;
for(auto it = routeVec[u].begin(); it != routeVec[u].end(); ++ it)
{
if(!visitFlagVec[*it])
{
visitFlagVec[*it] = true;
tmpPathVec.push_back(*it);
tmpDstDis += route[u][*it];
dfs(*it);
tmpDstDis -= route[u][*it];
tmpPathVec.pop_back();
visitFlagVec[*it] = false;
}
}
}
int main()
{
cin >> C >> N >> Sp >> M;
int tmpSt, tmpEnd, tmpDis;
for(int i = ; i <= N; ++i)
cin >> bikeNumStaVec[i];
CLR(route,0x7f);
while(M--)
{
cin >> tmpSt >> tmpEnd >> tmpDis;
route[tmpSt][tmpEnd] = tmpDis;
route[tmpEnd][tmpSt] = tmpDis;
routeVec[tmpSt].push_back(tmpEnd);
routeVec[tmpEnd].push_back(tmpSt);
}
visitFlagVec[] = true;
tmpPathVec.push_back();
dfs();
cout << dstSendBikeNum;
for(int i = ; i < dstPathVec.size(); ++i)
{
if(i == ) printf(" ");
else printf("->");
cout << dstPathVec[i];
}
cout << " " << dstBackBikeNum;
return ;
}
dijkstra和dfs实现代码
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define MAXNUM 510
#define CLR(a,b) memset(a,b,sizeof(a));
const int INF = 0x7f7f7f7f;
int C, N, Sp, M, dstSendBikeNum = INF, dstBackBikeNum = INF;
vector<int> dstPathVec, tmpPathVec, preRoute[MAXNUM];
vector<int> bikeNumStaVec(MAXNUM,);
vector<int> visitFlagVec(MAXNUM,false);
int dis[MAXNUM];
int route[MAXNUM][MAXNUM];
void dijkstra(int u)
{
dis[u] = ;
for(int i = ; i <= N; ++ i)
{
int tmpMinDis = INF, v = -;
for(int j = ; j <= N; ++ j)
{
if(!visitFlagVec[j] && dis[j] < tmpMinDis)
{
v = j;
tmpMinDis = dis[j];
}
}
if(v == - || v == Sp)
return;
visitFlagVec[v] = true;
for(int j = ; j <= N; ++ j)
{
if(!visitFlagVec[j] && dis[j] > dis[v] + route[v][j])
{
dis[j] = dis[v] + route[v][j];
preRoute[j].clear();
preRoute[j].push_back(v);
}
else if(!visitFlagVec[j] && dis[j] == dis[v] + route[v][j])
preRoute[j].push_back(v);
}
}
}
void dfs(int u)
{
if(u == )
{
tmpPathVec.push_back(u);
int halfC = C/, tmpBikeNum = , tmpSendBikeNum = , tmpBackBikeNum = ;
for(int i = tmpPathVec.size()-; i >= ; -- i)
{
tmpBikeNum += halfC-bikeNumStaVec[tmpPathVec[i]];
if(tmpBikeNum > )
{
tmpSendBikeNum += tmpBikeNum;
tmpBikeNum = ;
}
}
tmpBackBikeNum = -tmpBikeNum;
if((tmpSendBikeNum < dstSendBikeNum) || (dstSendBikeNum == tmpSendBikeNum && dstBackBikeNum > tmpBackBikeNum))
{
dstSendBikeNum = tmpSendBikeNum;
dstBackBikeNum = tmpBackBikeNum;
dstPathVec = tmpPathVec;
}
tmpPathVec.pop_back();
return;
}
tmpPathVec.push_back(u);
for(auto it = preRoute[u].begin(); it != preRoute[u].end(); ++ it)
dfs(*it);
tmpPathVec.pop_back();
}
int main()
{
cin >> C >> N >> Sp >> M;
int tmpSt, tmpEnd, tmpDis;
for(int i = ; i <= N; ++i)
cin >> bikeNumStaVec[i];
CLR(route,0x7f);
CLR(dis,0x7f);
while(M--)
{
cin >> tmpSt >> tmpEnd >> tmpDis;
route[tmpSt][tmpEnd] = tmpDis;
route[tmpEnd][tmpSt] = tmpDis;
}
dijkstra();
dfs(Sp);
cout << dstSendBikeNum;
reverse(dstPathVec.begin(), dstPathVec.end());
for(int i = ; i < dstPathVec.size(); ++i)
{
if(i == ) printf(" ");
else printf("->");
cout << dstPathVec[i];
}
cout << " " << dstBackBikeNum;
return ;
}
另:一种错误(dfs中,最后判断第二条件时出现了错误)
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define MAXNUM 510
#define CLR(a,b) memset(a,b,sizeof(a));
const int INF = 0x7f7f7f7f;
int C, N, Sp, M, dstSendBikeNum = INF, dstBackBikeNum = INF;
vector<int> dstPathVec, tmpPathVec, preRoute[MAXNUM];
vector<int> bikeNumStaVec(MAXNUM,);
vector<int> visitFlagVec(MAXNUM,false);
int dis[MAXNUM];
int route[MAXNUM][MAXNUM];
void dijkstra(int u)
{
dis[u] = ;
for(int i = ; i <= N; ++ i)
{
int tmpMinDis = INF, v = -;
for(int j = ; j <= N; ++ j)
{
if(!visitFlagVec[j] && dis[j] < tmpMinDis)
{
v = j;
tmpMinDis = dis[j];
}
}
if(v == - || v == Sp)
return;
visitFlagVec[v] = true;
for(int j = ; j <= N; ++ j)
{
if(!visitFlagVec[j] && dis[j] > dis[v] + route[v][j])
{
dis[j] = dis[v] + route[v][j];
preRoute[j].clear();
preRoute[j].push_back(v);
}
else if(!visitFlagVec[j] && dis[j] == dis[v] + route[v][j])
preRoute[j].push_back(v);
}
}
}
void dfs(int u)
{
if(u == )
{
tmpPathVec.push_back(u);
int tmpBikeNum = , tmpBackBikeNum = ;
for(int i = ; i < tmpPathVec.size()-; ++i)
{
tmpBikeNum += bikeNumStaVec[tmpPathVec[i]]-C/;
if(tmpBikeNum > )
{
tmpBackBikeNum += tmpBikeNum;
tmpBikeNum = ;
}
}
tmpBikeNum = -tmpBikeNum;
if(tmpBikeNum < dstSendBikeNum)
{
dstSendBikeNum = tmpBikeNum;
dstBackBikeNum = tmpBackBikeNum;
dstPathVec = tmpPathVec;
}
else if(tmpBikeNum == dstSendBikeNum && tmpBackBikeNum < dstBackBikeNum)
{
dstPathVec == tmpPathVec;
dstBackBikeNum = tmpBackBikeNum;
}
tmpPathVec.pop_back();
return;
}
tmpPathVec.push_back(u);
for(auto it = preRoute[u].begin(); it != preRoute[u].end(); ++ it)
dfs(*it);
tmpPathVec.pop_back();
}
int main()
{
cin >> C >> N >> Sp >> M;
int tmpSt, tmpEnd, tmpDis;
for(int i = ; i <= N; ++i)
cin >> bikeNumStaVec[i];
CLR(route,0x7f);
CLR(dis,0x7f);
while(M--)
{
cin >> tmpSt >> tmpEnd >> tmpDis;
route[tmpSt][tmpEnd] = tmpDis;
route[tmpEnd][tmpSt] = tmpDis;
}
dijkstra();
dfs(Sp);
cout << dstSendBikeNum;
reverse(dstPathVec.begin(), dstPathVec.end());
for(int i = ; i < dstPathVec.size(); ++i)
{
if(i == ) printf(" ");
else printf("->");
cout << dstPathVec[i];
}
cout << " " << dstBackBikeNum;
return ;
}
PAT A1018的更多相关文章
- PAT A1018 Public Bike Management (30 分)——最小路径,溯源,二标尺,DFS
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- [PAT] A1018 Public Bike Management
[思路] 题目生词 figure n. 数字 v. 认为,认定:计算:是……重要部分 The stations are represented by vertices and the roads co ...
- PAT (Advanced Level) Practice(更新中)
Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...
- PAT_A1018#Public Bike Management
Source: PAT A1018 Public Bike Management (30 分) Description: There is a public bike service in Hangz ...
- PAT甲级——A1018 Public Bike Management
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- PAT甲级题解分类byZlc
专题一 字符串处理 A1001 Format(20) #include<cstdio> int main () { ]; int a,b,sum; scanf ("%d %d& ...
- 《转载》PAT 习题
博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...
- PAT Judge
原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/677 题目如下: The ranklist of PAT is generated fr ...
- PAT/字符串处理习题集(二)
B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...
随机推荐
- Windows驱动开发-符号链接和设备名
windows下的设备是以"\Device\[设备名]”形式命名的. 例如磁盘分区的C盘,D盘的设备名称就是 "\Device\HarddiskVolume2” "\De ...
- 管理和安装 chart【转】
安装 chart 当我们觉得准备就绪,就可以安装 chart,Helm 支持四种安装方法: 安装仓库中的 chart,例如:helm install stable/nginx 通过 tar 包安装,例 ...
- 8051单片机中访问int中字节的方法
在使用单片机中,unsigned int 占2个字节,unsigned char 占一个字节.而单片机是实行的字节寻址.16字节的bit寻址实在是不好用, 不好用在不能建数组. 在实际的开发过程中,要 ...
- word2010文档如何隐藏右侧灰色空白不可编辑区域
word2010文档如何隐藏右侧灰色空白不可编辑区域, (word2007也是差不多的操作) 两种方法: 1.点击图中的“最终状态”按钮: 2.点击图中的”以嵌入方式显示所有修订“的按钮:
- ROS学习笔记3-基础课程之文件系统向导
准备工作需要使用如下命令安装ros的教程: $ sudo apt-get install ros-<distro>-ros-tutorials 其中,distro为所用ros的发行版本,该 ...
- Oracle修改密码
1. 登陆oracle sqlplus '/as sysdba' 2. 修改密码 ALTER USER 用户名IDENTIFIED BY 要修改的密码 ; 3.解锁 alter user 用户名 ac ...
- 删除C代码中的注释行【状态机】
今天在学ruby时遇到的一个经典的题目,一直都知道但从来没有实现过.呈上状态机,代码略.(写代码的时候还是需要注意一些小情况的)
- ubuntu---NVIDIA驱动 + CUDA 安装完可能会遇见的问题
如果稍不注意:系统内核.GCC.下载的版本不对应.安装过程中选项选择不正确,在NVIDIA驱动 + CUDA 安装完后可能会遇见一些问题. 一.登陆不进桌面 可能的操作: (1)nivida驱动安装完 ...
- 小米手机收到升级鸿蒙OS提示?官方回应
虽然尚未得到官方确认,但华为“鸿蒙”OS已经成为网络热门话题,在机圈引发热议. 本周,互联网上出现了显示为MIUI 10手机被锁定,屏幕上出现“小米将于2020年9月15日全面停止服务,届时您所有设备 ...
- C++ 根据日期判断星期几
int CaculateWeekDay(int y,int m, int d) { ||m==) { m+=; y--; } *m+*(m+)/+y+y/-y/+y/)%; ; }