PAT甲级1018留坑——第一个测试点未过(Dijikstar+Dfs)
题目分析:
主要是先进行狄杰斯特拉求出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)的更多相关文章
- PAT甲级1018. Public Bike Management
PAT甲级1018. Public Bike Management 题意: 杭州市有公共自行车服务,为世界各地的游客提供了极大的便利.人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站. ...
- PAT甲级1010踩坑记录(二分查找)——10测试点未过待更新
题目分析: 首先这题有很多的坑点,我在写完之后依旧还有第10个测试点没有通过,而且代码写的不优美比较冗长勿喷,本篇博客用于记录写这道题的一些注意点 1.关于两个不同进制的数比大小一般采用将两个数都转化 ...
- 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 ...
- 【PAT甲级】1053 Path of Equal Weight (30 分)(DFS)
题意: 输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重 ...
- 【PAT甲级】1021 Deepest Root (25 分)(暴力,DFS)
题意: 输入一个正整数N(N<=10000),然后输入N-1条边,求使得这棵树深度最大的根节点,递增序输出.如果不是一棵树,输出这张图有几个部分. trick: 时间比较充裕数据可能也不是很极限 ...
- PAT甲级考前整理(2019年3月备考)之一
转载请注明出处:https://www.cnblogs.com/jlyg/p/7525244.html 终于在考前,刷完PAT甲级131道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种 ...
- PAT甲级:1136 A Delayed Palindrome (20分)
PAT甲级:1136 A Delayed Palindrome (20分) 题干 Look-and-say sequence is a sequence of integers as the foll ...
- 2.18比赛(T2,T3留坑)
2.18比赛(T2,T3留坑) pdf版题面 pdf版题解 超越一切(ak) [题目描述] 夏洛可得到一个(h+1)×(w+1)的巧克力,这意味着她横着最多可 以切 h 刀,竖着最多可以切 w 刀 她 ...
- PAT甲级1021. Deepest Root
PAT甲级1021. Deepest Root 题意: 连接和非循环的图可以被认为是一棵树.树的高度取决于所选的根.现在你应该找到导致最高树的根.这样的根称为最深根. 输入规格: 每个输入文件包含一个 ...
随机推荐
- 识别led灯和驱动器的关联关系
精准答案: https://wenku.baidu.com/view/db1f7361ac02de80d4d8d15abe23482fb4da02d6.html?qq-pf-to=pcqq.group ...
- 本地VS调试服务器 IIS 程序
由于读书的关系,毕业后选择在武汉,工作三年,至今年5月份挪窝到沿海某二线城市,换城市相当于裸辞,一切从头开始,新的城市,新的居住地,新的空气,新工作,新挑战.一直忙忙碌碌,孜孜不倦的汲取着,担心脱队, ...
- 【Gamma阶段】第九次Scrum Meeting
冰多多团队-Gamma阶段第九次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 卓培锦 美化前端及编辑器界面,编辑器风格切换(添加夜间模式) UI界面手势切换 牛雅哲 添加scp工具,添加 ...
- solr配置同义词,停止词,和扩展词库(IK分词器为例)
定义 同义词:搜索结果里出现的同义词.如我们输入”还行”,得到的结果包括同义词”还可以”. 停止词:在搜索时不用出现在结果里的词.比如is .a .are .”的”,“得”,“我” 等,这些词会在句子 ...
- losetup命令使用
1.losetup命令 Linux系统losetup命令用来设置循坏设备,循坏设备可以把文件虚拟成块设备,借此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱等设备,并挂入当作目录来使用. (1 ...
- JavaScript核心知识点
一.JavaScript 简介 一.JavaScript语言的介绍:JavaScript是基于对象和原型的一种动态.弱类型的脚本语言 二.JavaScript语言的组成:JavaScript是由核心语 ...
- [转帖]自动交互式脚本--expect
自动交互式脚本--expect https://www.cnblogs.com/zhuiluoyu/p/4873869.html 我们经常会遇到一些需要与服务器程序打交道的场景,比如,从登陆某个服务器 ...
- Feign实现自定义错误处理
关键操作 实现ErrorDecoder接口 问题和背景 最近项目中在大量使用Feign和OkHttp作为http客户端使用,开发效率得到显著的提升.但也面临一些问题,比如每个下游系统的异常返回方式不同 ...
- python 笔记——生成器和迭代器
#-*- coding:utf-8 -*- a=[1,2,3,4] for i,j in enumerate(a): print i,j '''只有ij时,''' a=[1,2,3,4] for i ...
- 记:使用IScroll.js 开发picker日历组件遇到的问题及经验总结
IScroll中文文档 第一个问题: 边界留白 就是这种,上边界(最小),下边界(最大)有两个列表的位置是不能选择的.解决的办法是: 在HTML中,添加空白节点就行了. 第二个问题:初始化之后的滚动停 ...