給出乙個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不是fa就用dfn[v]更新low[u](u可以連回v)【不能用low[v],因為low[v]包含v的後代能連回】
#include #include#include
#include
using
namespace
std;
const
int n=1e5+5,m=1e5+5,inf=1e9+5
;inline
intread()
while(c>='
0'&&c<='9')
returnx;}
int n=0
,m,u,v;
struct
edgee[m
<<1
];int h[n],cnt=0
;inline
void ins(int u,int
v)int dfn[n],low[n],dfc=0
,iscut[n];
void dfs(int u,int
fa)else
if(dfn[v]min(low[u],dfn[v]);
}if(fa==0&&child==1) iscut[u]=0;}
intmain()
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i,0
);
int ans=0
;
for(int i=1;i<=n;i++) if(iscut[i]) ans++;
printf(
"%d\n
",ans);
for(int i=1;i<=n;i++) if(iscut[i]) printf("
%d "
,i);
}
洛谷P3388 模板 割點
都快忘了割點怎麼搞了 對所有點分兩類 1.根節點 2.非根節點 顯然根節點是很好做的 只需要數一下有沒有兩個子樹以上 對於非根節點 利用tarjan演算法 回憶到dfn的定義 時間戳,即在dfs中第幾個被訪問到 low 經過最多一條後向邊 棧中橫叉邊能到達的最小的節點時間戳 對於當前節點now來說,...
洛谷P3388 模板 割點
模板 割點 割點集合 乙個頂點集合v,刪除該集合的所有定點以及與這些頂點相連的邊後,原圖不連通,就稱集合v為割點集合 點連通度 最小割點集合中的頂點數 邊連通度 最小割邊集合中的邊數 割點 割點集合中唯一的乙個元素 tarjan求縮點 乙個點為縮點的條件 1.該點為根,搜尋樹中有大於1個子樹 2.該...
模板 割點(洛谷P3388)
給出乙個 n 個點,m 條邊的無向圖,求圖的割點。第一行輸入 n m 下 m 行每行輸入 x y 表示 x 到 y 有一條邊。第一行輸出割點個數。第二行按照節點編號從小到大輸出節點,用空格隔開。include include includeusing namespace std const int ...