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[+ ...
随机推荐
- P1073 多选题常见计分法
P1073 多选题常见计分法 转跳点:
- HiBench成长笔记——(6) HiBench测试结果分析
Scan Join Aggregation Scan Join Aggregation Scan Join Aggregation Scan Join Aggregation Scan Join Ag ...
- Linux-nftables
Linux-nftables https://netfilter.org/ https://netfilter.org/projects/iptables/index.html https://net ...
- 链表题目汇总(python3)
1.从头到尾打印链表 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. # -*- coding:utf-8 -*- class ListNode: def __init__(self ...
- 08.swoole学习笔记--异步tcp客户端
<?php //创建异步tcp客户端 $client=new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC); //注册连接成功的回调函数 $c ...
- 《机学一》特征工程1 ——文本处理:sklearn抽取、jieba中文分词、TF和IDF抽取
零.机器学习整个实现过程: 一.机器学习数据组成 特征值: 目标值: 二.特征工程和文本特征提取 1.概要: 1.特征工程是什么 2.特征工程的意义:直接影响预测结果 3.scikit-learn库 ...
- Fr3设置图片打印
见 fr3的文件内容,为xml <?xml version="1.0" encoding="utf-8"?> <TfrxReport Vers ...
- 动手实验01-----vCenter 微软AD认证配置与用户授权
环境说明: AD域-> centaline.net 阅读目录: 1. 配置与AD认证源 2.权限角色 1. 配置与AD认证源 登陆vCenter后,在 系统管理 -> 配置 -> ...
- 中文文本分类之TextRNN
RNN模型由于具有短期记忆功能,因此天然就比较适合处理自然语言等序列问题,尤其是引入门控机制后,能够解决长期依赖问题,捕获输入样本之间的长距离联系.本文的模型是堆叠两层的LSTM和GRU模型,模型的结 ...
- 131-PHP子类可以访问父类public修饰的类成员
<?php class father{ //定义father类 public function cook(){ return '烹饪'; } } class son extends father ...