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

  1. PAT A1018 Public Bike Management (30 分)——最小路径,溯源,二标尺,DFS

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

  2. [PAT] A1018 Public Bike Management

    [思路] 题目生词 figure n. 数字 v. 认为,认定:计算:是……重要部分 The stations are represented by vertices and the roads co ...

  3. PAT (Advanced Level) Practice(更新中)

    Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...

  4. PAT_A1018#Public Bike Management

    Source: PAT A1018 Public Bike Management (30 分) Description: There is a public bike service in Hangz ...

  5. PAT甲级——A1018 Public Bike Management

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

  6. PAT甲级题解分类byZlc

    专题一  字符串处理 A1001 Format(20) #include<cstdio> int main () { ]; int a,b,sum; scanf ("%d %d& ...

  7. 《转载》PAT 习题

    博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...

  8. PAT Judge

    原题连接:https://pta.patest.cn/pta/test/16/exam/4/question/677 题目如下: The ranklist of PAT is generated fr ...

  9. PAT/字符串处理习题集(二)

    B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...

随机推荐

  1. ubuntu18.04窗口截图和选区截图快捷键

    解决方法: 1.点击左下角的系统设置. 2.点击设备. 3.点击键盘,可查看各种截图操作的快捷键.  PS:双击图中的快捷键可以设置新的快捷键.

  2. 解决Google浏览器不能打开kubernetes dashboard方法【转】

    在这片文章中,我将展示如何在Google Chrome上打开kubernetes dashboard.本文不叙述如何安装搭建docker和kubernetes,有关详情请上网查阅! 很多小伙伴们在自己 ...

  3. OBS Studio 24.0 RC1 发布 – 有大惊喜

    导读 对于那些使用OBS Studio进行跨平台直播和屏幕录制需求的人来说,OBS Studio 24.0即将推出,但首先发布的是他们的候选版本,以审查进入这一重大更新的新功能. OBS Studio ...

  4. python merge、join、concat用法与区别

     由于合并变化较大,以后函数可能会修改,只给出一些例子作为参考 总结: merge.join 1.当没有索引时:merge.join为按照一定条件合并 2.当有索引.并按照索引合并时,得到结果为两者混 ...

  5. DOM基础1

    Document Object Model 文档对象模型 1.改内容: innerHTML 例:div1.innerHTML = "我能干<br />什么";      ...

  6. Centos7忘记mysql的root用户密码

    1.先停止mysql服务 ​[root@CentOS ~]# ps -ef | grep mysql root : pts/ :: /bin/sh /usr/local/mysql/bin/mysql ...

  7. 指定盘符获取u盘PID、VID、序列号等信息

    最近学习scsi和DeviceIoControl,下载了微软WDK一些例子,以下代码精简自Windows-driver-samples-master\storage\tools\spti\src\sp ...

  8. java流程控制语句要点

    java流程控制语句要点 一.java7增强后的switch switch语句后面的控制表达式的数据类型只能是byte.short.char.int四种整数类型,不能是boolean类型,java7以 ...

  9. java核心-多线程(1)-知识大纲

    Thread,整理一份多线程知识大纲,大写意 1.概念介绍 线程 进程 并发 2.基础知识介绍 Java线程类 Thread 静态方法&实例方法 Runnable Callable Futur ...

  10. React 学习笔记(3) B站视频总结1

    视频地址 项目基础 react-cli // 项目结构 src │ App.js # 应用根组件 │ index.js # 入口js ├─api ├─assets ├─components ├─con ...