割去一个点,问图中还剩的最大分支数
找一个割点,使去掉该割点后,图中分支数最大
1.当图中没有边时,分支数为点的个数n,减去1,即n-1;
2.最大分值数为,ans-1+mx,ans为原图的分支数,mx为去掉某个原图分支上的割点后,该分支的变成分支数
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int dfn[10005],low[10005],sum[10005];
int n,m,ntime,mx;
vector<int> q[10005];
void tarjan(int u,int fa)//割点的模板
{
int i,son=0;
dfn[u]=low[u]=ntime++;
for(i=0;i<q[u].size();i++){
int v=q[u][i];
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
sum[u]++;
son++;
}
else if(v!=fa)
low[u]=min(low[u],dfn[v]);
}
if(fa==-1){
if(son>1)
sum[u]=son;
}
else if(sum[u]>0){
sum[u]++;
}
}
int main()
{
int i,j,k;
while(scanf("%d%d",&n,&m),n||m){
if(m==0){
printf("%d\n",n-1);
continue;
}
for(i=0;i<n;i++)
{
dfn[i]=0;
low[i]=0;
sum[i]=0;
q[i].clear();
}
while(m--){
int a,b;
scanf("%d%d",&a,&b);
q[a].push_back(b);
q[b].push_back(a);
}
int ans=0;
ntime=1;
mx=-1;
for(i=0;i<n;i++)
if(!dfn[i])
{
tarjan(i,-1);
ans++;
}
for(i=0;i<n;i++)
mx=max(mx,sum[i]);
printf("%d\n",ans-1+mx);
}
return 0;
}