社区讨论

Dijkstra 被卡求助

题目总版参与者 3已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@lo8cv69b
此快照首次捕获于
2023/10/27 16:32
2 年前
此快照最后确认于
2023/10/27 16:32
2 年前
查看原帖
题目是同学出的:U232371 数竞队の决战局2
这里是解决 op=Dop = D 时的问题的,考虑分层图跑最短路,但是 Dijkstra 被他卡了,求助大佬帮忙卡卡常。
注:std 最慢的点 O2 优化之后是 615ms,但我这个得 3s 多,虽然这里过了,但是今天拿他的题目考试的时候是 TLE
CPP
namespace type_D{
    struct node{
        int id, dis;
    };
    int dis[MAXN * 6], path[MAXN];
    bool vis[MAXN * 6];
    bool operator < (node a, node b){ return a.dis < b.dis; };
    bool operator > (node a, node b){ return a.dis > b.dis; };
    void add_edge(int u, int v, int w){
        e[++cnt].pre = head[u];
        e[cnt].to = v; e[cnt].w = w;
        head[u] = cnt;
    }
    void dijkstra(int st){
        memset(dis, 0x3f, sizeof(dis));
        priority_queue<node, vector<node>, greater<node> > q;
        dis[st] = 0; q.push((node){st, 0});
        while(!q.empty()){
            int now = q.top().id; q.pop();
            if(vis[now]) continue;
            vis[now] = true;
            for(int i = head[now]; i; i = e[i].pre){
                if(dis[e[i].to] > dis[now] + e[i].w){
                    dis[e[i].to] = dis[now] + e[i].w;
                    if(!vis[e[i].to]) q.push((node){e[i].to, dis[e[i].to]});
                }
            }
        }
    }
    void main(){
        scanf("%d%d%d",&n,&m,&t);
        for(int i = 1; i <= m; i++){
            int x; scanf("%d",&x);
            for(int j = 1; j <= x; j++) scanf("%d",&path[j]);
            for(int j = 1; j <  x; j++){
                int w; scanf("%d",&w);
                for(int k = 0; k <= t; k++) add_edge(path[j] + k * n, path[j + 1] + k * n, w);
                for(int k = 1; k <= t; k++) add_edge(path[j] + (k - 1) * n, path[j + 1] + k * n, 0);
            }
        }
        dijkstra(1);
        int ans = n;
        for(int k = 1; k <= t; k++){
            if(dis[n + k * n] < dis[ans]) ans = n + k * n;
        }
        printf("%d\n",dis[ans]);
    }
}

回复

8 条回复,欢迎继续交流。

正在加载回复...