题意简述:有向图求一个点使得所有环经过这个点,若无解则输出-1。
对于所有环\(\{C_i=\{V_i,E_i\}\}\),\(\bigcap V_i=\overline\bigcup\overline V_i\),右式等价于不断从原图点集中去掉每个环没有的点,考虑这个过程。
直接从图中去掉点难以导向做法,我们考虑\(\overline \bigcup\overline V_i=V_0\cap\overline\bigcup\overline V_i\),即从\(V_0\)中去掉每个环不包含的点。
考虑求\(V_0 \cap V_i\)实际上可以描述为初始集合为\(S=V_0\),任选起点后沿着边遍历\(C_0\),过程中从\(S\)中去掉\(\overline V_i\)中包含的点。
可以发现对于每个\(V_i\),要么和\(V_0\)无交(此时无解),要么\(V_0\subset V_i\)(此时\(V_0\cap V_i=V_0\),\(V_i\)无意义。),要么会从\(V_0\)中去掉\(C_0\)的一些极大的子路径,记为\(P_i\)。
考虑从\(P_i\)中任选一个路径,记为\(o\),记其起点终点为\(u,v\),记\(x=pre_u,y=nxt_v\),则\(c_0\)可划分为\(x\to y\)(记为\(p_0\))和\(y\to x\)(记为\(p_1\))2条路径。记\(V_i\)中\(x\to y\)的路径为\(q\),易知\(V_{p_0}\cap V_q=\{x,y\}\),且\(p_1\)和\(q\)可以构成一个构成一个环\(C_j\)满足\(P_j=\{o\}\)。因此,对于任意一个环\(C_i\),若\(|P_i|>1\)则该环无意义,我们只需考虑所有环\(\{C_i\}\)使得其\(|P_i|=1\)。
后面做法较为简单,不赘述了(其实是懒)。
