無向圖的割點、橋
阿新 • • 發佈:2018-12-18
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<stack> #include<queue> #define maxn 100005 using namespace std; int n,m,dfn[maxn],low[maxn],tim,scc,cut,brg,iscut[maxn]; bool insta[maxn]; vector<int>g[maxn],ans; stack<int>sta; void dfs(int now,int fa){ dfn[now]=low[now]=++tim; bool flag=0; int k = 0; for(int i=0,siz=g[now].size(),v;i<siz;i++){ if(!dfn[v=g[now][i]]){ k++; dfs(v,now),low[now]=min(low[v],low[now]); if(low[v]>=dfn[now]) iscut[now]=1; if(low[v]>dfn[now]) brg++; } else if(v!=fa) low[now]=min(low[now],dfn[v]); } if(!fa && k==1) iscut[now]=0; } void tarjan(){ memset(dfn,0,sizeof dfn); memset(low,0,sizeof low); tim=0,scc=0; for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i,0); } int main(){ scanf("%d%d",&n,&m); int u,v; for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); g[u].push_back(v), g[v].push_back(u); } tarjan(); for(int i=1;i<=n;i++) if(iscut[i]) cut++; printf("%d\n%d",cut,brg); }