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