一道求割點的板子題。還是採用經典的tarjan演算法。
首先大致和tarjan求強連通分量相似,都是用\(dfn_x\)表示訪問到\(x\)的時間(時間戳),\(low_x\)表示通過\(x\)回邊能走到的時間戳最小的點的時間戳。
然後我們考慮一下對於乙個點如何判斷它是否為割點:
low[now]=min(low[now],dfn[e[i].to]);
而不是
low[now]=min(low[now],low[e[i].to]);
然後引用一下luogu某大佬taoran的話:
由於此處是一張無向圖,我們有雙向建了邊,導致節點可以回溯到它的父節點;然後就當板子題切掉吧。code而如果從它的父節點或其父節點的另一棵子樹上有向上很多的返祖邊,
這時把子節點的low值賦為父節點的low,就可能導致其low==其父節點low《其父節點dfn,
從而使本該是割點的點被忽視了,答案就少了
#include#include#includeusing namespace std;
const int n=100005;
struct edge
e[n<<1];
int head[n],father[n],low[n],dfn[n],cnt,tot,ans,n,m,x,y;
bool cut[n];
inline char tc(void)
inline void read(int &x)
inline void write(int x)
inline void add(int x,int y)
inline int min(int a,int b)
else if (e[i].to!=father[now]) low[now]=min(low[now],dfn[e[i].to]);
if (!father[now]&&res>=2) !cut[now]&&(cut[now]=1,++ans);
}int main()
Luogu P3388 割點模板
luogu p3388 在乙個無向圖中,如果有乙個頂點集合,刪除這個頂點集合以及這個集合中所有頂點相關聯的邊以後,圖的連通分量增多,就稱這個點集為割點集合。如果某個割點集合只含有乙個頂點x 也即是乙個割點集合 那麼x稱為乙個割點。為了便於理解,我們可以從狹義上進行分析 對於乙個連通無向圖,刪去其中的...
Luogu P3388 模板 割點(割頂)
割點 給出乙個nn個點,mm條邊的無向圖,求圖的割點。輸入格式 第一行輸入n,mn,m 下面mm行每行輸入x,yx,y表示xx到yy有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入樣例 1 複製 6 7 1 21 3 1 42 5 3 54 5 5 6輸出...
洛谷3388 割點(割頂)模板
題目背景 割點題目描述 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入輸出格式 輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入輸出樣例 輸入樣例 1 6 7 1 2 1 3 1 4 2 5 3...