图的割边

暂时没有传送门

割边

割边呢,也称作桥,和割点很像,指的是在一个图中,去掉某一条边后,这个图不联通了。

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<string>
 7 #include<algorithm>
 8 using namespace std;
 9 inline int min(int a,int b){return a<b?a:b;}
10 inline int max(int a,int b){return a>b?a:b;}
11 inline int read()
12 {
13     int x=0,f=1;char ch=getchar();
14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
15     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
16     return x*f;
17 }
18 int n,m;
19 int head[100006];
20 int nxt[200006],to[200006];
21 int total=0;
22 void add(int x,int y){
23     total++;
24     to[total]=y;
25     nxt[total]=head[x];
26     head[x]=total;
27     return ;
28 }
29 int dfn[100006],low[100006];
30 int tot=0;
31 void tarjan(int x,int fa){
32     dfn[x]=low[x]=++tot;
33     for(int e=head[x];e;e=nxt[e]){
34         if(!dfn[to[e]]){
35             tarjan(to[e],x);//扩展 
36             low[x]=min(low[x],low[to[e]]);//回溯low 
37             if(low[to[e]]>dfn[x]) printf("%d->%d\n",x,to[e]);//如果两点之间只有这一条路径,那么它是割边 
38         }
39         else if(to[e]!=fa) low[x]=min(low[x],dfn[to[e]]);//如果一个点被搜索过了并且是x的儿子或者是它的父亲,就可以直接回溯 
40     }
41     return ;
42 }
43 int main(){
44     n=read(),m=read();
45     for(int i=1;i<=m;i++){
46         int x=read(),y=read();
47         add(x,y);//无向图 
48         add(y,x);
49     }
50     for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,i);
51     return 0;
52 }

 

posted @ 2019-10-20 16:41  nono_ttaa  阅读(209)  评论(0编辑  收藏  举报