1 条题解
-
0
思路
桥条件是low[child]>dfn[parent],必须按父边ID跳过而非按父顶点,避免平行边误判;使用迭代DFS处理3万点深链,支持多组0或0 0终止。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n,m;while(cin>>n&&n){cin>>m;vector<vector<pair<int,int>>>g(n);for(int id=0;id<m;id++){int u,v;cin>>u>>v;--u;--v;g[u].push_back({v,id});g[v].push_back({u,id});}vector<int>dfn(n),low(n),parent(n,-1),pe(n,-1),next(n);int timer=0,ans=0;for(int s=0;s<n;s++)if(!dfn[s]){vector<int>st(1,s);dfn[s]=low[s]=++timer;while(!st.empty()){int u=st.back();if(next[u]<(int)g[u].size()){auto e=g[u][next[u]++];int v=e.first;if(e.second==pe[u])continue;if(!dfn[v]){parent[v]=u;pe[v]=e.second;dfn[v]=low[v]=++timer;st.push_back(v);}else low[u]=min(low[u],dfn[v]);}else{st.pop_back();if(parent[u]>=0){int p=parent[u];if(low[u]>dfn[p])ans++;low[p]=min(low[p],low[u]);}}}}cout<<ans<<'\n';}}
- 1