随笔分类 - 强连通 && 双连通
摘要:pku 2762 Going from u to v or from v to u?题意:给定一个有向图,对任意一对x,y,判断是否存在x到y 或 y到x 的路径。。。分析:首先,可以想到的是,强连通缩点,因为对于一个极大强连通分量,任意俩点均可达,所以先缩成一个点,,缩点之后,得到的是一个DAG,判断图是否为弱连通图==》即判断拓扑序列是否唯一pku2762#include<iostream>#include<algorithm>#include<vector>#include<stack>#include<queue>#inclu
阅读全文
摘要:题意:题目的意思很清晰,对于一个有向图,将N个点划分成最少的集合个数,同时满足俩个条件:1) 任意俩点,若互相可达,则必须在同一个集合中2)属于同一个集合的任意俩个点对(u,v),至少存在一条路径,使得v对于u 可达 或者 u 对于v 可达分析:对于上述俩个条件,为了简化问题,需要进行缩点,属于同一个强连通分量的点,缩成同一个点,重新构图,可以用tarjan 算法;这样,第一个条件就一定满足了,接着只剩下第二个条件了,其实,任意俩点,只要在同一条有向路径上,则可以属于一个集合,,,那么问题就转化为用最小的有向路径去覆盖所有的点(最小路径覆盖数==点数-最大匹配数)View Code #incl
阅读全文
摘要:题意:判断一个图是否为仙人掌图分析:直观的说,仙人掌图就是一个一个的圈直接“粘”在一起的图,圈 之间没有公共边。仙人掌图有这样三个性质:性质1 仙人掌图的DFS树没有横向边。----------------------------------性质2 Low(v)<=DFN(u) (v是u的儿子) (即没有桥)性质3 设某个点v有a(u)个儿子的Low值小于DFS(u),同时u自己有b(u)条逆向边。那么a(u)+b(u)<2。View Code #include<iostream>#include<algorithm>#include<stack>
阅读全文
摘要:题意:给出一些点,有值,给出一些边,然后求去掉一条边后将分成连通的两部分,且两部分的差值最小分析:首先,求出所有的双连通分量,缩点,重新构图,再dfs (类似树形DP的过程)一遍就可以找出最小差值。但是,因为tarjan 算法的本质就是一个dfs,所有可以在求双连通分量的同时求出最小差值。注意:有重边的情况,因为人为的加了一条双向边,那个是无效的,但是原图的重边是有效的, 在这里WA 了N次View Code #include<iostream>#include<algorithm>#include<vector>#include<stack>#
阅读全文
摘要:hdu1827#include<iostream>#include<algorithm>#include<stack>#include<vector>#define MAXN 1010 using namespace std; vector<int> g[MAXN],g2[MAXN]; stack<int> st; int n,w[MAXN],dfn[MAXN],low[MAXN],f[MAXN],index; int in[MAXN],num,sccw[MAXN]; bool vis[MAXN],instack[MAXN
阅读全文