看看我交了几次就知道这题坑有多少了。感觉比有些蓝题写起来都痛苦。 所以为什么不是蓝题
第二篇题解有两处错误。
本人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,不要重蹈覆辙