版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/83548604
#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);
}