传送门
解析:
本来难度只能称之为水题,但是数据毒瘤啊。
什么考虑一下图不联通的情况,在考虑一下用vector来存题目中没有给数目的边。tarjan乱搞,记录子树个数就可以成功A这道题。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
inline int getint(){
re int num;
re char c;
while(!isdigit(c=gc()));num=c^48;
while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
return num;
}
cs int N=10004;
vector<int> e[N];
int dfn[N],low[N],dfs_clock;
int cut[N];
inline void tarjan(int u,int fa){
dfn[u]=low[u]=++dfs_clock;
for(int re i=0;i<e[u].size();++i){
int re v=e[u][i];
if(v==fa)continue;
if(!dfn[v]){
cut[v]=0;
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 n,m,cnt,ans=-1;
signed main(){
while(n=getint(),m=getint(),n||m){
for(int re i=0;i<n;++i)e[i].clear();
memset(dfn,0,sizeof dfn);
cnt=0;
ans=-1;
while(m--){
int u=getint(),v=getint();
e[u].push_back(v);
e[v].push_back(u);
}
for(int re i=0;i<n;++i)
if(!dfn[i])cut[i]=-1,tarjan(i,i),++cnt;
for(int re i=0;i<n;++i)ans=max(ans,cut[i]);
cout<<ans+cnt<<"\n";
}
return 0;
}