割點
給出乙個n個點,m條邊的無向圖,求圖的割點。
輸入格式:
第一行輸入n,m
下面m行每行輸入x,y表示x到y有一條邊
輸出格式:
第一行輸出割點個數
第二行按照節點編號從小到大輸出節點,用空格隔開
輸入樣例#1:
6 71 21 3
1 42 5
3 54 5
5 6
輸出樣例#1:
15
n,m均為100000
tarjan 圖不一定聯通!!!
割點真是乙個非常神奇的東西。
雖然和tarjan很像,
而且能理解其中的奧秘。
但是**還是看的一臉蒙蔽,。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8#define lli long long int
9using
namespace
std;
10const
int maxn=1000001;11
const
int maxn=0x7fffff
;12 inline void read(int &n)
1317
while(c>='
0'&&c<='9'
)18
19 flag==1?n=-x:n=x;20}
21int
n,m;
22struct
node
23edge[maxn];
26int
head[maxn];
27int num=1;28
void add_edge(int x,int
y)29
35int dfn[maxn];//
dfs的順序
36int low[maxn];//
每個點能追溯到的最近公共祖先
37int
vis[maxn];
38int ans[maxn];//
是否是割點
39int ansnum; //
割點的數量
40int tot=0;41
int tarjan(int now,int
fa)4262}
63}64}
65return
low[now];66}
67int
main()
6878
for(int i=1;i<=n;i++)
79if(low[i]==0
)80 tarjan(i,-1
);
81 printf("
%d\n
",ansnum);
82for(int i=1;i<=n;i++)
83if(ans[i]==1
)84 printf("
%d "
,i);
85return0;
86 }
update in 2017.11.7
補乙份利用void型別實現的**
#include#include#include#include#includeusing namespace std;
const int maxn=1e6+10;
inline int read()
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*f;
}struct node
edge[maxn];
int head[maxn];
int num=1;
inline void add_edge(int x,int y)
int dfn[maxn];//詢問的時間
int low[maxn];//最早能追溯到的祖先
int n,m,tot;//當前已經列舉了多少節點
int ans[maxn];//是否是割點
int ansnum=0;
void tarjan(int now,int fa) }}
int main()
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i,-1);
printf("%d\n",ansnum);
for(int i=1;i<=n;i++)
if(ans[i])
printf("%d ",i);
return 0;
}
P3388 模板 割點(割頂)
割點 題目描述 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入樣例 1 複製6 7 1 21 3 1 42 5 3 54 5 5 6輸出樣例 1 複製...
P3388 模板 割點(割頂)
n 給定一張無向圖g g g,求圖的割點 s ol utio nsolution soluti on判斷條件 非搜尋樹起點x xx,任意乙個子節點y yy,滿足dfn x l ow y dfn x low y dfn x l ow y 搜尋樹起點rtrt rt,至少兩個子節點y yy,滿足dfn x...
P3388 模板 割點(割頂)
割點 給出乙個n個點,m條邊的無向圖,求圖的割點。輸入格式 第一行輸入n,m 下面m行每行輸入x,y表示x到y有一條邊 輸出格式 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入樣例 1 複製6 7 1 21 3 1 42 5 3 54 5 5 6 輸出樣例 1 複製1 5 ...