给一个图,删除一个点,问最多得到多少个块
当low[y]>dfn[x] ,发现一个割点时,删去这个点会出现新的块
ans =原来的块的个数+ 删点产生的块
#include <bits/stdc++.h> using namespace std ; const int N=1e5+1,M=5*N; int f[N]; int n,m,dfn[N],low[N],pool,ans; int nxt[M],go[M],hd[N],all; void add(int x,int y){ nxt[++all]=hd[x]; go[all]=y,hd[x]=all; } void tar(int x,int fa){ dfn[x]=low[x]=++pool; int i,y; int t=0; for(i=hd[x];i;i=nxt[i]){ y=go[i]; if(!dfn[y]){ tar(y,x); t++; low[x]=min(low[x],low[y]); if(dfn[x]<=low[y]) f[x]++; } else if(y!=fa) low[x]=min(low[x],dfn[y]); } if(fa==0){ f[x]=t-1; } } void init(){ int i,x,y; all=pool=0; for(i=1;i<=n;i++) dfn[i]=low[i]=f[i]=hd[i]=0; for(i=1;i<=m;i++) cin>>x>>y,++x,++y,add(x,y),add(y,x); } int main(){ //freopen("in","r",stdin);freopen("out","w",stdout); int i,c; while(cin>>n>>m,n||m){ if(!m){ cout<<n-1<<endl;continue; } if(!n){ cout<<0<<endl;continue; } ans=c=0; init(); for(i=1;i<=n;i++) if(!dfn[i]) c++,tar(i,0); for(i=1;i<=n;i++){ ans=max(ans,f[i]); } cout<<ans+c<<endl; } }
标签:电力,int,++,一本,1525,dfn,low,go,hd From: https://www.cnblogs.com/towboa/p/16928237.html