SCU-4527 NightMare2(Dijkstra+BFS) !!!错误题解!!!
错解警告!!!
描述
可怜的RunningPhoton又做噩梦了。。但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着这些财宝并活着逃出去的话,他就发财啦。不过,这次的迷宫不再是一个矩形方格了,而是由点和边组成的图,每条边都有通过该边的时间,以及由于神奇阵法而产生的对财宝数量的限制(即通过这条边只能带上不超过一定数量的财宝,否则炸弹将笋干爆炸!)。现在,RuningPhoton又开始疑惑了,在保证能活着逃出去的情况下,他最多能拿多少价值的财宝?
输入
第一行一个整数T(1≤T≤10),代表样例数。
每个样例的第一行有3个整数n(1≤n≤10,000),m(1≤m≤50,000),K(1≤K≤500,000),分别代表迷宫的点数,边数以及炸弹离爆炸的剩余时间。刚开始RuningPhoton在1,出口在n。
接下来m行,每行4个整数u,v(1≤u,v≤n),cap(1≤cap≤2∗109),dis(1≤dis≤50,000)分别代表每条边的两端点,该边的财宝数量限制以及通过这条边的时间。
(P.S. 这次在计时到0的时候到达n点也算逃出迷宫)
输出
每组数据输出一行,代表在保证或者逃出去的情况下能得到的最多财宝价值,被炸死输出"Poor RunningPhoton!"(不含引号)。
样例输入
2
2 1 10
1 2 13 10
4 4 20
1 2 1000 15
2 4 999 6
1 3 100 15
3 4 99 4
样例输出
13
99
思路:
正向Dijkstra,反向bfs,反向bfs的过程中,将起始点的dis设为k,cap设为inf,然后,如果与之相连的顶点的最短路的值,小于当前顶点的dis值减去边权,那么就将其放入队列,并将dis值设为顶点的dis值减去边权,cap值为当前节点的cap值与边的cap值的最小值。
错误原因:
推测:BFS的队列占用内存太大
MLE代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int n,m,k;
const int maxn = 10005;
const int inf = 2100000000;
vector<int>u[maxn];
vector<int>w[maxn];
vector<int>c[maxn];
int dis[10005];
struct node
{
int x,dis,cap;
bool operator<(const node t)const
{
return t.dis<dis;
}
}; void init()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<maxn;i++){
u[i].clear();
w[i].clear();
c[i].clear();
}
int x,y,z,r;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&x,&y,&z,&r);
u[x].push_back(y);
w[x].push_back(r);
c[x].push_back(z);
u[y].push_back(x);
w[y].push_back(r);
c[y].push_back(z);
}
} void Dijkstra()
{
for(int i=1;i<=n;i++){
dis[i]=inf;
}
priority_queue<node>q;
dis[1]=0;
q.push(node{1,0,0});
node exa;
while(!q.empty()){
exa=q.top();
q.pop();
int t=exa.x;
int siz=u[t].size();
for(int i=0;i<siz;i++){
if(dis[u[t][i]]>w[t][i]+dis[t]){
dis[u[t][i]]=w[t][i]+dis[t];
q.push(node{u[t][i],dis[u[t][i]],0});
}
}
}
} int BFS()
{
queue<node>q;
q.push(node{n,k,inf});
node exa;
int ans=-1;
while(!q.empty()){
exa=q.front();q.pop();
int t=exa.x;
if(t==1){ans=max(ans,exa.cap);continue;}
int siz=u[t].size();
for(int i=0;i<siz;i++){
if(exa.dis-w[t][i]>=dis[u[t][i]]){
q.push(node{u[t][i],exa.dis-w[t][i],min(c[t][i],exa.cap)});
}
}
}
return ans;
} int solve()
{
Dijkstra();
return BFS();
} int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
init();
int t=solve();
if(t==-1){printf("Poor RunningPhoton!\n");}
else printf("%d\n",t);
}
}
提示
删掉输出,可以将结果化为WA哦!
SCU-4527 NightMare2(Dijkstra+BFS) !!!错误题解!!!的更多相关文章
- SCU 4527 NightMare2 最短路+二分 好题
可怜的又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着这些财宝并活着逃出去的话,他就发财啦.不过,这次 ...
- CTSC1999补丁VS错误题解
题目描写叙述 Description 错误就是人们所说的Bug.用户在使用软件时总是希望其错误越少越好.最好是没有错误的.可是推出一个没有错误的软件差点儿不可能,所以非常多软件公司都在疯狂地发放补丁( ...
- CDOJ 1964 命运石之门【最短路径Dijkstra/BFS】
给定数字n,m(1<=n,m<=500000) 将n变为n*2花费2,将n变为n-3花费3,要求过程中所有数字都在[1,500000]区间内. 求将n变为m的最少花费 思路:建图 将每个数 ...
- luogu1979 华容道 (dijkstra+bfs)
我想动某个点的话,一定要先把空白点移动到这个点旁边,然后调换这个点和空白点,一直重复 那么,我们就可以记一些状态(x,y,s) (s={0,1},{0,-1},{1,0},{-1,0}),表示我要动的 ...
- URAL 1837. Isenbaev's Number (map + Dijkstra || BFS)
1837. Isenbaev's Number Time limit: 0.5 second Memory limit: 64 MB Vladislav Isenbaev is a two-time ...
- 逃离迷宫(BFS)题解
Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...
- SPOJ LAS(BFS)题解
题目:VJ 思路: BFS+回溯,但是要剪枝,看了dalao的题解,超时+WA无数发,终于过了 #include<cstdio> #include<cstring> #incl ...
- 【HDU3085】nightmare2 双向BFS
对于搜索树分支很多且有明确起点和终点的情况时,可以采用双向搜索来减小搜索树的大小. 对于双向BFS来说,与单向最大的不同是双向BFS需要按层扩展,表示可能到达的区域.而单向BFS则是按照单个节点进行扩 ...
- newcode wyh的吃鸡(优势队列+BFS)题解
思路: 要用优势队列,因为有的+2,有的+1,所以队列中的步长是不单调的,所以找到一个答案但不一定最小,所以用优势队列把小的放在队首. 要记录状态,所以开了三维,题目和昨天做的那道小明差不多 vis开 ...
随机推荐
- Log4j2配置与使用
依赖包: <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --> <depend ...
- Asp.Net Core 输出 Word
In one of the ASP.NET Core projects we did in the last year, we created an OutputFormatter to provid ...
- VS Code 编辑器
使用VS Code 编辑器有一段时间了,感觉非常好用,已经成为了我的第一选择了.现在需要学习了一下了. 1,更改编辑器的默认设置 文件 =>首选项 => 设置 或 ctrl + ,(逗号) ...
- python 机械学习之sklearn的数据正规化
from sklearn import preprocessing #导入sklearn的处理函数用于处理一些大值数据 x_train, x_test, y_train, y_test = tr ...
- 安装 xadmin 报错: Command "python setup.py egg_info" failed with error code 1 in C:\Users\Python\AppData\Local\Temp\pip-install-1k1byg0p\xadmin\
报错详情 安装 xadmin 组件的时候报错 不论是命令行还是 pycharm 方式都不行 分析报错 按照报错提示是说 README.rst 文件的编码问题导致. 解决报错 通过 github 下载源 ...
- mysql 0x80004005 unable to connect to any of the specified mysql hosts
语言:c# 问题:偶尔会出现连不上mysql 报标题的这个错误. 解决方法:把server = localhost 改为 =127.0.0.1 或者静态IP ,按着改暂时没出现了,继续观望!
- Android 开发中 SQLite 数据库的使用
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...
- Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解
BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...
- 【CF526G】Spiders Evil Plan(贪心)
[CF526G]Spiders Evil Plan(贪心) 题面 洛谷 CodeForces 给定一棵树,要求选择\(y\)条链,满足被链覆盖的所有点在树上联通,且\(x\)必定在联通块中. 对于每次 ...
- 【BZOJ3142】[HNOI2013]数列(组合计数)
[BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...