给一个图,删除一个点,问最多得到多少个块
当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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!