题目分析:

主要是先进行狄杰斯特拉求出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. nginx配置神器

    原文 https://mp.weixin.qq.com/s/zFEk7XzHj3xPReDXEnQxcQ https://nginxconfig.io/ Nginx作为一个轻量级的HTTP服务器,相比 ...

  2. 导出OpenID为txt文件的方法

    导出OpenID为txt文件的方法 public function export(){ $shop = M("Shop"); $arr = $shop->field('ope ...

  3. IE 浏览器设置 打开新的选项卡而不是弹出窗口

    首先打开IE的页面  找到工具 —点击Internet选项

  4. jquery插件实现瀑布流

    jquery插件实现瀑布流<!DOCTYPE html><html lang="en"><head> <meta charset=&quo ...

  5. VisualStudio更改项目文件夹名称

    新建了一个空的解决方案(SolutionTest.sln),在文件夹Api中新建了一个webapi项目,物理位置为解决方案根目录下的叫Api文件夹里, 现在想把文件夹名由Api改为MyApi,需要做以 ...

  6. Dubbo快速入门 二

    2.dubbo核心概念 2.1).简介 Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调 ...

  7. pytest_全局变量的使用

    这里重新阐述下PageObject设计模式: PageObject设计模式是selenium自动化最成熟,最受欢迎的一种模式,这里用pytest同样适用 这里直接提供代码: 全局变量 conftest ...

  8. Google大数据三篇著名论文中文版

    Google File System中文版 Google MapReduce中文版 Google Bigtable中文版

  9. IP地址和MAC地址绑定的必要性

    计算机网络是一个共通的网络,世界上任何计算机都可以互相访问. 实现的原理基于网络通讯的互联网交互五层模型. 计算机网络的历史发展 当计算机网络技术初始利用的时代,几台计算机通过集线器连接,就可以实现网 ...

  10. Kafka学习笔记之Kafka自身操作日志的清理方法(非Topic数据)

    0x00 概述 本文主要讲Kafka自身操作日志的清理方法(非Topic数据),Topic数据自己有对应的删除策略,请看这里. Kafka长时间运行过程中,在kafka/logs目录下产生了大量的ka ...