题目分析:

主要是先进行狄杰斯特拉求出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. springboot修改页面不用重启的设置(idea)

       1) “File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Build project ...

  2. Win10,Anaconda,tensorflow-gpu安装教程

    ,参考于:https://www.cnblogs.com/guoyaohua/p/9265268.html 目录 前言 第一步:安装Anaconda 1.下载和安装 2.配置Anaconda环境变量 ...

  3. eclipse中正确创建Django项目

    本教程只说明eclipse中django项目的创建,不涉及django相关开发内容: 1."File" -> "New" -> "Othe ...

  4. Logstash测试的时候,报Error occurred during initialization of VM,Could not reserve enough space for object heap

    今天配置Logstash的时候,启动输入logstash ‐e 'input { stdin { } } output { stdout {} }'就开始报错了,Error occurred duri ...

  5. Ansible13:Playbook循环语句

    目录 循环语句 简介 loop关键字说明 在循环语句中注册变量 旧循环语句 1. with_items 2. with_nested 3. with_dict 4. with_fileglob 5. ...

  6. react 中 Modal 多次使用且带参数不同实现

    一.举例:对于 echatrs 的柱子分别需要弹窗 带参数 触发弹窗出现事件 showModalhref myChart.on('click', (params) => { switch (pa ...

  7. tkinter添加背景音乐

    一.问题利用tkinter来写一个游戏,添加一个背景音乐提高可玩性. 二.解决1.安装pygame首先是利用pygame的一个播放流:[pip install pygame]来完成pygame的安装. ...

  8. 【mysql】mysql5.7支持的json字段查询【mybatis】

    mysql5.7支持的json字段查询 参考:https://www.cnblogs.com/ooo0/p/9309277.html 参考:https://www.cnblogs.com/pfdltu ...

  9. php 无限极分类,根据父级 找子级

    /** * @param $data 数据(二维数组格式) * @param $adminId 管理员ID * @param $pid 权限的上级ID * @param int $level 水平变量 ...

  10. c++打印实心菱形,空心三角形,十字星,空心正方形,实心平行四边形

    今天翻资料的时候,无意间发现了一个文件,是刚接触编程的时候用c++写的一段程序,我称之为"图形打印机",想着把所有图形都打印出来,后来发现其实每种图形的代码都是一个思路,就不想做重 ...