提交时间:2025-11-10 18:33:42

运行 ID: 38851

#include<bits/stdc++.h> using namespace std; #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v bool AAA; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=4000010,M=10000010,inf=1e9; struct Edge{int v,nx;}edge[M<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,k,bel[MAXN],dfn[MAXN],low[MAXN],cnt; stack<int>st; vector<int>G[MAXN]; void dfs(int u,int lst){ dfn[u]=low[u]=++cnt; st.push(u); for(inx(u))if(I!=lst){ if(dfn[v])low[u]=min(low[u],dfn[v]); else dfs(v,I^1),low[u]=min(low[u],low[v]); } if(low[u]==dfn[u]){k++; while(st.top()!=u)G[k].pb(st.top()),bel[st.top()]=k,st.pop(); G[k].pb(st.top()),bel[st.top()]=k,st.pop(); } } int f[MAXN]; void dfs2(int x,int lst){ dfn[x]=1; f[x]=0; int fl=0; for(auto u:G[x]){ int sum=0,cnt=0; for(inx(u))if(bel[v]!=bel[u]&&bel[v]!=lst){ dfs2(bel[v],bel[u]); cnt++; sum+=f[bel[v]]; }else if(bel[v]==lst)cnt++,sum++; f[x]+=sum-cnt/2; fl+=cnt&1; } if(G[x].size()>1&&fl<=1)f[x]++; } void slv(){CNT=1; n=read(),m=read(); for(int i=1;i<=m;i++){ int u=read(),v=read(); add_side(u,v); } for(int i=1;i<=n;i++)if(!dfn[i])dfs(i,0); for(int i=1;i<=n;i++)dfn[i]=low[i]=0; int ans=0; for(int i=1;i<=n;i++)if(!dfn[bel[i]])dfs2(bel[i],0),ans+=f[bel[i]]; printf("%d",ans); } bool BBB; signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); // int _=read();while(_--) slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; //// cerr<<((&AAA)-(&BBB))/1024.0/1024<<"MB\n"; return 0; }