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开 ...
随机推荐
- Yii2控制台命令
Yii2控制台表格输出: 例如: $in_sheet_number_queue = []; $wms_material_in_sheet_list = \core\models\WmsMaterial ...
- 一、纯css实现顶部进度条随滚动条滚动
一.效果图 二.直接复制粘贴 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- CS新建排版
1.拉菜单栏barmanage,去掉不要的头部和尾部 ,选择控件bar属性optionsbar 全部为false,防止菜单拖动. 2.拉一个panelcontrol属性dock 设置顶部,在拉一个p ...
- Spring4 MVC Hibernate4 maven集成
http://www.cnblogs.com/leiOOlei/p/3727859.html
- react使用setstate注意的两点
1.this.state里的属性不修改,或是只修改一个,那么不修改的剩下的属性不会被变动. this.state={ name:"Aliece", age:19, msg:&quo ...
- codeforces722B
Verse Pattern CodeForces - 722B You are given a text consisting of n lines. Each line contains some ...
- codeforces157B
Trace CodeForces - 157B One day, as Sherlock Holmes was tracking down one very important criminal, h ...
- poj-1236(强连通分量)
题意:给你n个点,每个点可能有指向其他点的单向边,代表这个点可以把软件传给他指向的点,然后解决两个问题, 1.问你最少需要给几个点,才能使所有点都能拿到软件: 2.问你还需要增加几条单向边,才能使任意 ...
- BZOJ4372烁烁的游戏——动态点分治+线段树(点分树套线段树)
题目描述 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠.皮皮鼠会被 ...
- Codeforces1065F Up and Down the Tree 【树形DP】
推荐一道联赛练习题. 题目分析: 你考虑进入一个子树就可能上不来了,如果上得来的话就把能上来的全捡完然后走一个上不来的,所以这就是个基本的DP套路. 代码: #include<bits/stdc ...