题目分析:

主要是先进行狄杰斯特拉求出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. sql server 2016 AlwaysOn实现无域高可用全教程

    一.简介环境:小编使用的服务器是windows server 2016(系统服务器) + sql server 2016(数据库服务器)(windows server 2016 + sql serve ...

  2. Perl 使用perl命令批量替换文件内容

    对linux系统下面多个文本文件内容做处理,是SA经常需要完成的工作.如何高效的完成这个工作,perl应该是一个不错的语言工具.你甚至不需要编写perl脚本,用命令就可以完成上面的工作. perl 命 ...

  3. Spring Security教程(三)

    在上一篇博客中讲解了用Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就算默认提供的表结构很复杂,也不一定能满足项 ...

  4. Java编程思想之十一 持有对象

    如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. 11.1 泛型和类型安全的容器 使用ArrayList:创建一个实例,用add()插入对象,然后用get()访问对象 ...

  5. Oracle GoldenGate 同步数据至Hbase

    该方法没试过,先记下再说 1.软件版本说明: Goldengate 12c 12.2.0.1 for Oracle(源端) Goldengate 12c 12.3.0.1 for Bigdata (目 ...

  6. 决策树(下)-Xgboost

    参考资料(要是对于本文的理解不够透彻,必须将以下博客认知阅读,方可更加了解Xgboost): 1.对xgboost的理解(参考资料1和4是我认为对Xgboost理解总结最透彻的两篇文章,其根据作者pa ...

  7. 12. Scala模式匹配

    12.1 match 12.1.1 基本介绍 Scala中的模式匹配类似于Java中的switch语法,但是更加强大 模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需 ...

  8. 递归求兔子数列第n项的值

    #include <iostream> using namespace std; int f(int n)//递归f数列的第n项 { ,y=,z; ||n==) { ; } else { ...

  9. 聊聊Golang逃逸分析

    逃逸分析的概念,go怎么开启逃逸分析的log. 以下资料来自互联网,有错误之处,请一定告之. 什么是逃逸分析 wiki上的定义 在编译程序优化理论中,逃逸分析是一种确定指针动态范围的方法——分析在程序 ...

  10. Smack Extensions用户手册

    Smack Extensions用户手册 XMPP协议包括基本协议和许多可选扩展,通常记录为“XEP”.Smack为核心XMPP协议提供了org.jivesoftware.smack包,为许多协议扩展 ...