题目分析:

主要是先进行狄杰斯特拉求出0点到每个点的最短路后用dfs求出所有的路径,将路径方案加入vector排序选择need最小和rest最小的方案,但是第一个测试却过不去,欢迎指正!!感谢!!

值得注意的是对于一条路径上的所有点进行调整的时候只能一步一步下来,后来多出的车不能用于调整前面走过的点的数量(很重要)

 #include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std; const int M = 0x3f3f3f3f;
int c, n, sp, m;
int mat[][];
int vis[]; //第一次用于作为求dist记录该点是否到达 第二次用于深搜回溯记录是否走过该点
int num[];
int dist[];
int les_dist = M;
struct Node{
int need;
int rest;
int distance;
vector<int> road;
}; vector<Node> r; //用于存放多个最短路情况下的行走方案,一个数据结构存放一个方案的信息 int minn(){
int k = -;
int Min = M;
int i;
for(i = ; i <= n; i++){
if(vis[i] == && dist[i] < Min){
Min = dist[i];
k = i;
}
}
return k;
} void run1(){
int i;
for(i = ; i <= n; i++){ //将从0点开始到其他点的距离设为到该点的最小值
dist[i] = mat[][i];
}
for(i = ; i <= n; i++){ //包含0点则有n+1个点 需要进行n次查询
int k = minn();
if(k == -) break; //查询次数未用完但k==-1则代表图不连通 退出循环
vis[k] = ;
int j;
for(j = ; j <= n; j++){
if(vis[j] == && dist[k] + mat[k][j] < dist[j]){
dist[j] = dist[k] + mat[k][j];
}
}
}
les_dist = dist[sp]; //全局变量les_dist存放到达终点的最短路径
} void dfs(Node s, int x){
//对于当前点x来说 需要判断此时存放路径数据的长度加到达x的长度和最短路径长度的关系
int pre = s.road.back(); //前一个点
if(s.distance + mat[pre][x] <= les_dist){
s.distance += mat[pre][x];
if(num[x] < c/){ //需要对该点的自行车的数量进行调整
if(s.rest >= c/ - num[x]){
s.rest -= (c/ - num[x]);
}else{ //剩余的不够
s.need += c/ - num[x] - s.rest; //需要的总数减去有的总数则为需要从0点发出的数量
s.rest = ;
}
}else if(num[x] > c/){
s.rest += num[x] - c/; //对多余的车都放入rest中
}
s.road.push_back(x); //将x加入已经走过的点的队列
//当点加完之后判断是否到了终点
if(x == sp){
r.push_back(s); //将s这个路径选择方案加入vector r
}
}
if(sp == x) return;
vis[x] = ;
int i;
for(i = ; i <= n; i++){
if(vis[i] == && mat[x][i] != M){
dfs(s, i);
vis[i] = ;
}
}
} bool cmp(Node a, Node b){
if(a.need != b.need) a.need < b.need;
else{
return a.rest < b.rest;
}
} void run2(){
memset(vis, , sizeof(vis)); //此次的vis需要重新清零
Node s;
s.need = ;
s.rest = ;
s.distance = ;
s.road.push_back(); //将0点作为起始点
dfs(s, ); //从0点开始 其中s为当前存放路径数据的数据结构
sort(r.begin(), r.end(), cmp);
Node ans = r.front();
if(sp != ){
printf("%d ", ans.need);
int i;
for(i = ; i < ans.road.size(); i++){
if(i != ) printf("->");
printf("%d", ans.road[i]);
}
printf(" %d\n", ans.rest);
}else{
printf("0 0 0\n");
}
} int main(){
scanf("%d%d%d%d", &c, &n, &sp, &m);
memset(mat, M, sizeof(mat));
memset(vis, , sizeof(vis));
int i;
for(i = ; i <= n; i++){ //输入没个点的自行车数量
scanf("%d", &num[i]);
}
for(i = ; i < m; i++){
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
mat[x][y] = z;
mat[y][x] = z;
}
run1(); //这部分完成了从起点到sp点的最短路径的计算
run2(); //通过bfs查询出通路然后加入vector
return ;
}

PAT甲级1018留坑——第一个测试点未过(Dijikstar+Dfs)的更多相关文章

  1. PAT甲级1018. Public Bike Management

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

  2. PAT甲级1010踩坑记录(二分查找)——10测试点未过待更新

    题目分析: 首先这题有很多的坑点,我在写完之后依旧还有第10个测试点没有通过,而且代码写的不优美比较冗长勿喷,本篇博客用于记录写这道题的一些注意点 1.关于两个不同进制的数比大小一般采用将两个数都转化 ...

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

  4. 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)

    题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ...

  5. 【PAT甲级】1021 Deepest Root (25 分)(暴力,DFS)

    题意: 输入一个正整数N(N<=10000),然后输入N-1条边,求使得这棵树深度最大的根节点,递增序输出.如果不是一棵树,输出这张图有几个部分. trick: 时间比较充裕数据可能也不是很极限 ...

  6. PAT甲级考前整理(2019年3月备考)之一

       转载请注明出处:https://www.cnblogs.com/jlyg/p/7525244.html 终于在考前,刷完PAT甲级131道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种 ...

  7. PAT甲级:1136 A Delayed Palindrome (20分)

    PAT甲级:1136 A Delayed Palindrome (20分) 题干 Look-and-say sequence is a sequence of integers as the foll ...

  8. 2.18比赛(T2,T3留坑)

    2.18比赛(T2,T3留坑) pdf版题面 pdf版题解 超越一切(ak) [题目描述] 夏洛可得到一个(h+1)×(w+1)的巧克力,这意味着她横着最多可 以切 h 刀,竖着最多可以切 w 刀 她 ...

  9. PAT甲级1021. Deepest Root

    PAT甲级1021. Deepest Root 题意: 连接和非循环的图可以被认为是一棵树.树的高度取决于所选的根.现在你应该找到导致最高树的根.这样的根称为最深根. 输入规格: 每个输入文件包含一个 ...

随机推荐

  1. redis 键值对 有效期设置

    redis 键值对 有效期设置redis中可以使用expire命令设置一个键的生存时间, 到时间后redis会自动删除它<-----> 类比于javaweb系统临时数据 过期删除功能 ex ...

  2. 微软SQL Server 2019 全新发布,更新内容亮点都在这里了

    IT之家11月7日消息 在Microsoft   Ignite 2019 大会上,微软正式发布了新一代数据库产品SQL Server 2019.使用统一的数据平台实现业务转型SQL Server 20 ...

  3. 关于qt creator各种假死的问题

    来自CSDN网友( qq191329827)内容,亲自尝试,且经历一致: 我有两个笔记本,1个台式机,都装了qt, 然后,我的thinkpad x1c,装上之后creator各种假死,网上看了好多解决 ...

  4. 【WebTerminal】gotty工具

    ./gotty -w -p 8888 --permit-arguments /bin/sh ./gotty -w -p 8888 --permit-arguments  docker exec -ti ...

  5. Qt 实现超时锁屏

    最近使用Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口. 一.效果 主窗口超时显示锁屏窗口: 系统窗口超时显示锁屏窗口: 二.实现思路 首先开启一个线程用于 ...

  6. cad.net 在位编辑的原理猜测及找到在位编辑状态的图元

    在位编辑的时候会产生一个名为 0-RefEdit0 的图层,原因不明.... 在位编辑的本质是一个长事务,长事务是使用编辑库的对象替换源对象,相当于剪辑.不理解没关系,请看下面的聊天记录.... [贵 ...

  7. python 关于celery的异步任务队列的基本使用(celery+redis)【无配置文件设置】

    环境说明: window7 X64 python 2.7.6 .celery 3.1.25.redis 2.10.6 本地安装的redis服务端版本号:Redis-x64-3.2.100 工程结构说明 ...

  8. java -- eclipse运行javaweb 项目

    这个是和上一个放在一块的 创建javaweb项目,要是想要创建maven项目,java项目都可以,我要和tomcat放在一块所以 就创建javaweb项目 创建项目起一个有意义的项目名    选择一个 ...

  9. HDU校赛 | 2019 Multi-University Training Contest 3

    2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...

  10. 【java】java删除文件delete和deleteOnExit 方法的区别,为什么调用deleteOnExit无效?

    delete() 是即刻删除 public boolean delete() { SecurityManager security = System.getSecurityManager(); if ...