关于迪杰斯特拉
  • 板块学术版
  • 楼主影子鱼llt
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/7/29 23:38
  • 上次更新2023/11/6 21:49:04
查看原帖
关于迪杰斯特拉
71922
影子鱼llt楼主2020/7/29 23:38

RT,今天做图论题,用了Dij,不知道下面两种写法在复杂度上有什么区别,望指教

void dij(int x)
{
    q.push(make_pair(0,make_pair(k + point[x],x)));
    memset(f,0x3f,sizeof(f));
    f[k + point[x]][x] = 0;
    while(!q.empty())
    {
        int val,pos,kx;
        val = q.top().first,pos = q.top().second.second,kx = q.top().second.first;
        q.pop();
        if(f[kx][pos] != val) continue;
        for(int i = ehead[pos];i;i = e[i].nxt)
        {
            int v = e[i].to;
            if(kx + point[v] > k * 2|| kx + point[v] < 0) continue;
            if(e[i].val + val < f[kx + point[v]][v])
            {
                f[kx + point[v]][v] = e[i].val + val;
                q.push(make_pair(e[i].val + val,make_pair(kx + point[v],v)));
            }
        }
    }
}
void dij(int x)
{
    q.push(make_pair(0,make_pair(k + point[x],x)));
    memset(f,0x3f,sizeof(f));memset(vis,0,sizeof(vis));
    f[k + point[x]][x] = 0;
    while(!q.empty())
    {
        int val,pos,kx;
        val = q.top().first,pos = q.top().second.second,kx = q.top().second.first;
        q.pop();
        if(vis[kx][pos]) continue;
        vis[kx][pos] = true;
        for(int i = ehead[pos];i;i = e[i].nxt)
        {
            int v = e[i].to;
            if(kx + point[v] > k * 2|| kx + point[v] < 0) continue;
            if(e[i].val + val < f[kx + point[v]][v])
            {
                f[kx + point[v]][v] = e[i].val + val;
                q.push(make_pair(e[i].val + val,make_pair(kx + point[v],v)));
            }
        }
    }
}
2020/7/29 23:38
加载中...