http://poj.org/problem?id=2117
题目描述:
求删除一个点后,图中最多有多少个连通块
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
const int MAXN=10010;
const int MAXM=100010;
using namespace std;
int dfn[MAXN],low[MAXN];
int subnets[MAXN];
bool iscut[MAXN];
int dfs_clock;
struct Edge{
int to,next;
}edge[MAXM];int head[MAXN],tot;
void Init(){
tot=0;
dfs_clock=0;
memset(head,0xff,sizeof(head));
memset(iscut,false,sizeof(iscut));
memset(subnets,0,sizeof(subnets));
memset(dfn,0,sizeof(dfn));
}
void addedge(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
edge[tot].to=u;
edge[tot].next=head[v];
head[v]=tot++;
}
void dfs(int u,int fa){
low[u]=dfn[u]=++dfs_clock;
int child=0;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){
child++;
dfs(v,u);
low[u]=min(low[v],low[u]);
if(low[v]>=dfn[u]){
iscut[u]=true;
subnets[u]++;
}
}
else if(v!=fa&&dfn[v]<dfn[u])
low[u]=min(low[u],dfn[v]);
}
if(fa<0&&child==1) iscut[u]=0;
if(fa<0) subnets[u]=child-1;
}
int n,m;
void solve(){
int cnt=0;
for(int u=0;u<n;++u){
if(!dfn[u]){
dfs(u,-1);
cnt++;
}
}
int ans=0;
for(int u=0;u<n;++u){
ans=max(ans,cnt+subnets[u]);
}
printf("%d\n",ans);
}
int main()
{
int u,v;
while(scanf("%d%d",&n,&m)==2){
if(n==0&&m==0) break;
Init();
for(int i=0;i<m;++i){
scanf("%d%d",&u,&v);
addedge(u,v);
}
solve();
}
return 0;
}