[Time Gate]
http://220.180.209.150:38888/problem/270
【解题思路】
Tarjan算法求割点、桥、缩点
【code】
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,m; struct ENode{ int u; int v; int w; int next; }edge[50005]; int p[10005],cnt; void Add(int u, int v){ edge[++cnt].u=u; edge[cnt].v=v; edge[cnt].next=p[u]; p[u]=cnt; } int dfn[50005],cTime,low[50005]; int cut[50005]; void Tarjan(int u, int fa ){ dfn[u]=low[u]=++cTime; for(int i=p[u];i;i=edge[i].next){ int v=edge[i].v; if(v == fa)continue; if(!dfn[v]){ Tarjan(v,u); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]){ cut[u]++; } } else low[u]=min(low[u],dfn[v]); } } int main(){ int x,y; while(1){ int c=0,ans=-1; scanf("%d%d",&n,&m); if(!n&&!m)break; memset(edge,0,sizeof(edge)); memset(p,0,sizeof(p)); cnt=0; memset(dfn,0,sizeof(dfn)); cTime=0; memset(low,0,sizeof(low)); memset(cut,0,sizeof(cut)); for(int i=0;i<m;i++){ scanf("%d%d",&x,&y); Add(x+1,y+1); Add(y+1,x+1); } for(int i=1;i<=n;i++) if(!dfn[i]){ c++; cut[i]=-1; Tarjan(i,-1); } for(int i=1;i<=n;i++) if(cut[i]>ans)ans=cut[i]; printf("%d\n",ans+c); } return 0; }
原文:https://www.cnblogs.com/66dzb/p/11153748.html