一个可以让n遍dij勉强卡过的小优化
查看原帖
一个可以让n遍dij勉强卡过的小优化
767561
Ascnbeta楼主2024/11/1 17:07

如果你并没有想到建反图,而是跑了n遍 dijkstra,那么你就获得了 TLE 70 pts 的好成绩。

不过注意的是在跑除了1号节点的dij时,我们实际上只是关心的是 n1n \to 1 的最短路,所以我们只许在跑到 11 结点时直接 return 即可。

如下方 TLE 代码:

void dij(int x) {
    while (!q.empty()) q.pop();
    q.push(node{x,0});
    while (!q.empty()) {
        node t = q.top();
        q.pop();
        vis[x][t.p] = true;
        for (int i = head[t.p];i;i = e[i].nxt) {
            if (vis[x][e[i].to]) continue;
            if (dis[x][e[i].to] > dis[x][t.p] + e[i].w) {
                dis[x][e[i].to] = dis[x][t.p] + e[i].w;
                q.push(node{e[i].to,dis[x][e[i].to]});
            }
        }
    }
}

只需要加上一句

if (t.p == 1 && x != 1) return;

即可,注意此时优先队列还不为空,下一次跑记得清空。

此外,你还需要找一个人比较少的时候卡一下评测机波动,然后你就可以卡过去了(本人最后一个点 990ms 卡过,无任何读入优化),保险一点你还可以关掉同步流或直接上快读快写()

2024/11/1 17:07
加载中...