图论。

强连通图 与 弱连通图 。

最短路 。dij 不支持负权。显然 值得一提的是利用斐波那契堆m+nlogn 。

一张 边权都是2的整数次幂 考虑 一下直接 结构体维护这个2的整次幂数组但比大小 太慢 考虑利用数据结构维护。

主席树维护每一位 (当然压位也是可以的 但却不必要 hash值维护 每个区间的值然后就可以快速判断辣。

我们还需要维护一个+1的操作 这就涉及到简单 的线段树上二分。和区间整体赋值问题。

floyd 设x y z 表示 x y 不经过z 这个点的最短路 。经典题目 应该是 分治一下 但是我不太回写,回来写一遍。

spfa 值得一提的是 复杂度 为nm 这个很容易被卡掉 具体卡掉代码如下。

QDC day4_最小值QDC day4_图论_02
#include <bits/stdc++.h>

using namespace std;

int N = 5000, M = 4*N-1, L = N;

int main()
{
    freopen("in", "w", stdout);
    printf("%d %d %d\n", N*2+1, M, L);
    for(int i=1; i<N; i++) printf("%d %d %d\n", i, i+1, 1);
    printf("%d %d %d\n", N, N*2+1, 1);
    for(int i=1; i<=N; i++) printf("%d %d %d\n", i, i+N, N-i+1);
    for(int i=1; i<=N; i++) printf("%d %d %d\n", i+N, i, 1);
    for(int i=1; i<N; i++) printf("%d %d %d\n", i+N, i+N+1, 1);
    for(int i=1; i<=L; i++) printf("%d ", i); putchar('\n');
    return 0;
}
View Code

当然还能在负环上面判断  当然dfs套spfa 这个方法有的时候更快一点。当然floyd 也是可以的。

边权递增最短路。

排序边权 然后 一条一条加入 然后每次松弛一下即可。

某个最短路的题目:

有m条边 连接两个节点 有k条铁路 连接1到某个点 求最多去掉多少条道路使得 1到任意节点的最短路不变。

这道题 

n个点m条边 dij 表示两点之间最短路 每个点都有点权 求 min{2*dij + aj};

这将等价于 min{dij+d 0 j} 即可。

n 个点 m 条边 其中有k 个关键点求 k个关键点之间两两之间最短路的最小值。

咕了。

一张图 A  B C 的基地 随意选 然后 求一个点 到A B C 的最短路和最小 求 期望和。

不会 咕了。膜改 bfs 一下 即可。