洛谷P1343地震逃生
最大流问题,FF算法:
链式前向星建边,异或来求反向边。
1 | const int N=2e3+86; |
最大流问题,FF算法:
链式前向星建边,异或来求反向边。
1 | const int N=2e3+86; |
1 | struct edge{int to,nxt,w;}e[N*2];int hd[N],tot=1; |
第一问应该转化为求入度为0的点个数
第二问取入度为0的点个数与出度为0的点个数的较大值,注意特判仅有一个强连通分量的情况。
参考:题解 P2746 【[USACO5.3]校园网Network of Schools】
1 | const int N = 186; |
在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量。它利用了一个事实,逆图(与各边方向相同的图形反转, transpose graph)有相同的强连通分量的原始图。
首先第一遍dfs扫一遍得到逆后序压倒栈dfn中
1 | int vis[MAX]; |
然后FILO进行第二次dfs扫逆图,对于每次递归结束的点集构成一个强连通分量
要注意的是标记的mark不能为0,否则这处if (!mark[*it])会出错
1 | int cnt; |
缩点,将该有向有环图变为有向无环图,然后dp求解
因为已经变为有向无环图,所以
然后用set容器储存各个强连通分量的边,用dp求解
1 | const int N = 2e4; |