Chinshyo @ 2023-08-14 14:22:57
看看我交了几次就知道这题坑有多少了。感觉比有些蓝题写起来都痛苦。 所以为什么不是蓝题
第二篇题解有两处错误。
本人dij+二分,就是看的第二篇题解。
for(int i = 1; i <= n; i++) {
dis[i] = LONG_LONG_MAX;
vis[i] = 0;
}
错误写法
if(dis[n] < b) return true;
return false;
正确写法
if(dis[n] <= b) return true;
return false;
如果你不开O2 0分,开O2RE,或者莫名其妙TLE,检查你的前向星数组是不是开了两倍!这可是无向图!
检查dis数组、头尾指针开没开long long!没开会WA,边权加起来会爆int。
如果你WA了Subtast2 第一个点(好像是这个吧),检查判断了第一个节点符不符合二分答案给出的钱的限制!
if(f[1] > cst) return false;
q.push(make_pair(-dis[y], y));
pair <ll, int> p = q.top();
q.pop();
ll dist = -p.first, x = p.second;
if(chk(mid)) {
r = mid;
} else {
l = mid + 1;
}
改成
if(tmp == 1) {
r = mid;
} else {
l = mid + 1;
}
我也不太懂为什么
bool chk(ll cst) {
for(int i = 1; i <= n; i++) {
dis[i] = LONG_LONG_MAX;
vis[i] = 0;
}
q.push(make_pair(0, 1));
dis[1] = 0;
if(f[1] > cst) return false;
while(!q.empty()) {
pair <ll, int> p = q.top();
q.pop();
ll dist = -p.first, x = p.second;
// if(x == n) {
// if(dis[n] > b) return false;
// return true;
// }
if(vis[x]) continue;
vis[x] = true;
for(int i = head[x]; i > 0; i = nxt[i]) {
ll y = ver[i], c = edge[i];
if(dist + c <= dis[y] && f[y] <= cst) {
dis[y] = dist + c;
q.push(make_pair(-dis[y], y));
}
}
}
if(dis[n] <= b) return true;
return false;
}
希望大家早日AC,不要重蹈覆辙
by continueOI @ 2023-08-14 21:14:36
@qxhAwA
by lzyzs @ 2023-08-27 15:15:04
太惨了
by Brilliant11001 @ 2023-08-30 12:06:14
@qxhAwA 太良心了%%%
by _Z_Y_X_SWS @ 2023-10-13 12:32:17
再加一条:用scanf没用%lld
by likezheng2023 @ 2024-02-04 09:59:57
把 O2 关了也可以解决函数出口问题
by ICYYYBRO @ 2024-03-25 21:15:43
感谢感谢