n个顶点m条边,请求割边
输入格式:
第一行给定三个整数 n,m 。n 个城镇,m 条道路(双向道路)。接下来给出 m 行,每行两个正整数表示这两个城镇之间有边相连。
输出格式:
一个整数,有几条关键道路。
样例 1 :
输入:6 6 1 3 1 4 2 3 2 4 2 5 5 6
输出:2
说明:2-5和5-6是桥
1 #include <cstdio>
2 #include <vector>
3 #include <cstring>
4
5
6 using namespace std;
7
8
9 const int max_n = 1e5 + 10;
10 int n,m;
11 int num[max_n],low[max_n];
12 int time_index,a,b;
13 vector<int> g[max_n];
14 int ans;
15
16
17 void dfs(int cur,int fa)
18 {
19 ++time_index;
20 num[cur]=time_index;
21 low[cur]=time_index;
22
23 for(int i=0;i<g[cur].size();++i)
24 {
25 int v=g[cur][i];
26 if(num[v]==0)
27 {
28 dfs(v,cur);
29 low[cur]=min(low[cur],low[v]);
30 if(low[v]>num[cur])
31 {
32 ++ans;
33 }
34 }
35 else if(fa!=v)
36 {
37 low[cur]=min(low[cur],num[v]);
38 }
39 }
40 }
41
42 void solve()
43 {
44 ans=0;
45 time_index=0;
46 memset(num,0,sizeof(num));
47
48 dfs(1,1);
49
50 printf("%d",ans);
51 }
52
53
54 int main()
55 {
56 scanf("%d %d",&n,&m);
57 for(int i=0;i<m;++i)
58 {
59 scanf("%d %d",&a,&b);
60 g[a].push_back(b);
61 g[b].push_back(a);
62 }
63
64 solve();
65
66 return 0;
67 }
来源:https://www.cnblogs.com/jishuren/p/12234204.html