[啊哈算法]关键道路(图的割边)

Description

割边也称为桥,即在一个无向连同图中,如果删除某条边后,图不再联通,那么这条边就是图的割边。下图中左图不存在割边,而右图有两条割边,分别是2-5和5-6。

 

Input

输入第一行有两个整数n,m。n表示有n个顶点,m表示有m条边。

接下来m行,每行形如"a b"表示顶点a和顶点b之间有边。

Output

输出图的所有割边,形如"a-b"表示顶点a到b的边。

Sample Input

6 6
1 4
1 3
4 2
3 2
2 5
5 6

Sample Output

5-6
2-5


 1 #include<iostream>
 2 //#include<fstream>
 3 using namespace std;
 4 int n,m;
 5 int root;
 6 int e[103][103];
 7 int num[103];
 8 int low[103];
 9 int index;
10 void dfs(int cur,int father){
11     index++;
12     num[cur]=index;
13     low[cur]=index;
14     for(int i=1;i<=n;i++){
15         if(e[cur][i]==1){
16             if(num[i]==0){
17                 dfs(i,cur);
18                 low[cur]=min(low[cur],low[i]);
19                 if(low[i]>num[cur])
20                     cout<<cur<<'-'<<i<<endl;
21             }
22             else if(i!=father)
23                 low[cur]=min(low[cur],num[i]);
24         }
25     }
26 }
27 int main(){
28 //    fstream file("haha.txt");
29 //    file>>n>>m;
30     cin>>n>>m;
31     for(int i=1;i<=n;i++){
32         for(int j=1;j<=n;j++){
33             e[i][j]=0;
34         }
35     }
36     int a,b;
37     for(int i=1;i<=m;i++){
38     //    file>>a>>b;
39         cin>>a>>b;
40         e[a][b]=1;
41         e[b][a]=1;
42     }
43     root=1;
44     dfs(1,root);
45     return 0;
46 }

割边比割点简单,只要把条件low[i]>=num[i]改成low[i]>num[i]就行了,并且割边的代码里因为不用判断cur是否为根节点,
所以也不用child了,


原文地址:https://www.cnblogs.com/fate-/p/12254734.html