首页 > 其他分享 >图论随笔

图论随笔

时间:2022-11-18 00:34:44浏览次数:71  
标签:图论 pq int cnt push 随笔 hd dis

\(k\) 短路

这玩意据说可以用 A* 搞,或者用什么可持久化堆或者左偏树维护最短路树?
笔者不才,只好用分层图套 dijkstra 写一下。
思路来自这里
大体流程:把一个点拆成 \(k\) 个(其实就是在 dis 数组加一维),对于一条边 \(<u,v>\),可以从 \(u\) 的层数开始找能更新的 \(v\) 的第几层,然后挨个继承上一层,最后把 \(u\) 能更新的更新了。
核心代码:

for (int i = hd[u]; i; i = nt[i])
{
    int v = ed[i];
    int w = co[i] + d;
    int p = -1;
    for (int d = l; d < k; d++)
    {
        if (dis[v][d] > w)
        {
            p = d;
            break;
        }
        // 如果是要求严格第 k 短,则需要加上下面这两句话:
        else if (dis[v][k] == w)
            break;
    }
    if (p != -1)
    {
        for (int d = k - 1; d > p; d--)
        {
            if (dis[v][d - 1] == 0x3f3f3f3f)
                continue;
            dis[v][d] = dis[v][d - 1];
            pq.push ({dis[v][d], d, v});
        }
        dis[v][p] = w;
        pq.push ({w, p, v});
    }
}

例题:
bxgzoj 040306 内部 oj。

点击查看代码
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N = 810, M = 8010, K = 45;
int n, m, k, ans;
int hd[N], ed[M], nt[M], co[M], cnt;
int dis[N][K];
bool vis[N][K];

struct node
{
    int d, l, u;
    bool operator <(const node a) const
    {
        return (d == a.d ? l > a.l : d > a.d);
    }
};

priority_queue<node> pq;

void add_edge (int u, int v, int w)
{
    ed[++cnt] = v;
    co[cnt] = w;
    nt[cnt] = hd[u];
    hd[u] = cnt;
}

void dijkstra()
{
    memset (dis, 0x3f, sizeof dis);
    dis[1][0] = 0;
    pq.push ({0, 0, 1});
    while (!pq.empty())
    {
        int u = pq.top().u;
        int l = pq.top().l;
        int d = pq.top().d;
        pq.pop();
        if (vis[u][l])
            continue;
        vis[u][l] = 1;
        if (u == n)
            continue;
        for (int i = hd[u]; i; i = nt[i])
        {
            int v = ed[i];
            int w = co[i] + d;
            int p = -1;
            for (int d = l; d < k; d++)
            {
                if (dis[v][d] > w)
                {
                    p = d;
                    break;
                }
            }
            if (p != -1)
            {
                for (int d = k - 1; d > p; d--)
                {
                    if (dis[v][d - 1] == 0x3f3f3f3f)
                        continue;
                    dis[v][d] = dis[v][d - 1];
                    pq.push ({dis[v][d], d, v});
                }
                dis[v][p] = w;
                pq.push ({w, p, v});
            }
        }
    }
}

int main()
{
    scanf ("%d%d%d", &k, &n, &m);
    for (int i = 1; i <= m; i++)
    {
        int u, v, w;
        scanf ("%d%d%d", &u, &v, &w);
        add_edge (u, v, w);
        add_edge (v, u, w);
    }
    dijkstra();
    for (int i = 0; i < k; i++)
        ans += dis[n][i];
    printf ("%d\n", ans);
    return 0;
}

洛谷 P2865 次短当成 \(k\) 短做。
洛谷 P2901 据说可以用拓扑搞。
POJ 2449 死因未知。

标签:图论,pq,int,cnt,push,随笔,hd,dis
From: https://www.cnblogs.com/cooluo/p/graph_write.html

相关文章

  • 【SSL 1588】猜道路(图论)
    猜道路题目链接:SSL1588题目大意给你n个点之间的最短路径,要你找到原来图上路径的总长度最短可以是多少,如果没有满足的图则输出-1。思路首先至于判断满足这个很简单......
  • 利用数组构建二叉树(随笔)
    做leetcode的时候,看到示例,突然想自己构建一颗树。。随即自己写了尝试写了一个方法(比较随意)测试用例://example-1[2,1,3]//example-2[2,null,3]//example-3[5,3......
  • 图论
    图论 最短路 dijkstra时间复杂度:N^2 堆优化版的就是优化找最小距离点时间复杂度:M*logN特点:不允许存在负权边算法原理:用最短距离去更新n个点的距离(实际有效更......
  • 图论
    图论CF76AGift思路因为有两个变量,所以先按照其中一个\(g\)排序,就像图海说的两只鸟先拍死一个再说。设生成树边集为\(T\),将排序后的边\(i\)加入时,\(g_{max}\)......
  • 图论做题记录
    CF242D题意:初始有一个\(n\)个点的图,依次添加\(m\)条边,对每次加边后需要回答满足每个点的度数都大于等于\(k\)的导出子图的最大点数。考虑将加边操作改为删边操作,关......
  • [图论]floyd统计最小环个数
    使用floyd可以求解最小环问题.单纯需要求出最小环长度,方法显而易见最小环-OIWiki(oi-wiki.org)然而,如果需要统计最小环的个数,就比较麻烦.记\(cnt_{i,j}\)表示从\(i......
  • 新随笔
    ‎TableofContents1.课件:TheMemoryHierachy1.课件:TheMemoryHierachyThememoryabstractionthebusmovqA,%raxmovq%rax,ANote......
  • PTA 21级数据结构与算法实验4—图论
    目录目录7-1邻接矩阵表示法创建无向图7-2邻接表创建无向图7-3图深度优先遍历7-4单源最短路径7-5列出连通集7-6哈利·波特的考试7-12关键活动7-13任务调度的合理性7......
  • 几个图论 trick
    歪歪球/se总结几个遇到过的图论trick.模拟图论算法面对图论中的问题(又或是其他方向的问题),在我们手中有的工具是Kruskal,Borůvka,Tarjan,Kosarajo甚至于dfs,bfs,......
  • DTOJ 2022.11.02 图论专题
    题单P1117无序字母对P5240「NOIP2020」排水系统P4042「NOIP2018」旅行P5169「CSP-S2020」函数调用P4563「NOIP2017」逛公园题解A题面:给定\(n\)个各不相同的......