很裸的仙人掌DP
算模板题吧
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=50005;
const int M=120005;
struct edge{
int u,v,w,next;
};
edge G[M];
int head[N],inum=1;
inline void add(int u,int v,int p){
G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}
int n,m;
int fat[N];
int pre[N],low[N],clk;
int f[N][2];
void dp(int rt,int y){
int t0,t1,f0=0,f1=0;
for (int i=y;i!=rt;i=fat[i]){
t0=f0+f[i][0]; t1=f1+f[i][1];
f0=max(t0,t1); f1=t0;
}
f[rt][0]+=f0;
f0=0; f1=-1000000000;
for (int i=y;i!=rt;i=fat[i]){
t0=f0+f[i][0]; t1=f1+f[i][1];
f0=max(t0,t1); f1=t0;
}
f[rt][1]+=f1;
}
#define V G[p].v
void dfs(int u,int fa){
fat[u]=fa; pre[u]=low[u]=++clk;
f[u][1]=1; f[u][0]=0;
for (int p=head[u];p;p=G[p].next)
{
if (!pre[V])
dfs(V,u),low[u]=min(low[u],low[V]);
else if (V!=fa)
low[u]=min(low[u],pre[V]);
if (low[V]>pre[u])
f[u][1]+=f[V][0],f[u][0]+=max(f[V][0],f[V][1]);
}
for (int p=head[u];p;p=G[p].next)
if (fat[V]!=u && pre[u]<pre[V])
dp(u,V);
}
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
int iu,iv;
read(n); read(m);
for (int i=1;i<=m;i++)
read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);
dfs(1,0);
printf("%d\n",max(f[1][0],f[1][1]));
return 0;
}