图的割边
暂时没有传送门
割边
割边呢,也称作桥,和割点很像,指的是在一个图中,去掉某一条边后,这个图不联通了。
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 }