AtCoder Beginner Contest 075 C bridge
桥就是指图中这样的边,删除它以后整个图不连通。本题就是求桥个数的裸题。
dfn[u]指在dfs中搜索到u节点的次序值,low[u]指dfs栈中u能追溯到的最早栈中节点从次序号。这里写的很好。
#include<bits/stdc++.h> using namespace std; const int maxn=500; vector<int> G[maxn]; int dfn[maxn],low[maxn]; int n,m,u,v,dep,ans; void init() { dep=ans=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); for(int i=0;i<=n;i++) G[i].clear(); } void Tarjan(int u,int fa) { dfn[u]=low[u]=++dep; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(!dfn[v]){ Tarjan(v,u); low[u]=min(low[u],low[v]); if(low[v]>dfn[u]) ans++; }else if(v!=fa) low[u]=min(low[u],dfn[v]); } } int main() { while(cin>>n>>m) { init(); for(int i=0;i<m;i++){ cin>>u>>v; G[u].push_back(v); G[v].push_back(u); } Tarjan(1,-1); cout<<ans<<endl; } return 0; }