都快忘了割點怎麼搞了
對所有點分兩類
1.根節點 2.非根節點
顯然根節點是很好做的 只需要數一下有沒有兩個子樹以上
對於非根節點 利用tarjan演算法
回憶到dfn的定義:時間戳,即在dfs中第幾個被訪問到 low:經過最多一條後向邊/棧中橫叉邊能到達的最小的節點時間戳
對於當前節點now來說,把整個圖分成了兩個子樹。假如low[vis]>=dfn[now],(注意不要把時間戳和編號序搞混) 也就是說vis節點最多只能追溯到now這棵子樹以內,而不能回到另一顆子樹去。就因為這個特殊的vis,now就成了割點。
然後注意細節吧 比如輸出 以及統計答案要單獨掃一遍 因為會有重複的
#include#define n 20005
#define m 100005
using namespace std;
templateinline void read(t &x)
struct edge
edge[2*m];
int n,m,tot,first[n];
inline void addedge(int x,int y)
int dfn[n],low[n],sign,cnt;
bool cut[n];
inline void dfs(int now,int fa)
else low[now]=min(low[now],dfn[vis]);
}if(fa==0&&child>=2) cut[now]=true; //根節點
}int main()
洛谷P3388 模板 割點
給出乙個n個點,m條邊的無向圖,求圖的割點。u是cut vertex的兩個條件 1.存在v使v及其所有後代沒有反向邊連回u的祖先 2.u是根且有兩個以上子節點 dfs一遍 low u 是u及其後代所能連回的最早祖先 沒有dfn v 就dfs v 然後用low v 更新low u v是u的後代 否則v...
洛谷P3388 模板 割點
模板 割點 割點集合 乙個頂點集合v,刪除該集合的所有定點以及與這些頂點相連的邊後,原圖不連通,就稱集合v為割點集合 點連通度 最小割點集合中的頂點數 邊連通度 最小割邊集合中的邊數 割點 割點集合中唯一的乙個元素 tarjan求縮點 乙個點為縮點的條件 1.該點為根,搜尋樹中有大於1個子樹 2.該...
模板 割點(洛谷P3388)
給出乙個 n 個點,m 條邊的無向圖,求圖的割點。第一行輸入 n m 下 m 行每行輸入 x y 表示 x 到 y 有一條邊。第一行輸出割點個數。第二行按照節點編號從小到大輸出節點,用空格隔開。include include includeusing namespace std const int ...