思路:求出去每去掉每个割点子图被分成的个数,取其中最大的。再加上原来有多少个图。
//864K
547MS
#include <stdio.h>
#include <string.h>
#define M 10010
struct data
{
to,nxt;
}edge[M*3];
int head[M],vis[M],dfn[M],low[M],cut[M];
int cnt,e,root;
void addedge (int cu,int cv)
{
cv;
= head[cu];
++;
}
int min (int a,int b)
{
> b ? b : a;
}
int max (int a, int b)
{
> b ? a : b;
}
void Tarjan (int u,int
fa)
//割点模板
{
0;
1;
low[u] = ++cnt;
head[u];i != -1;i = edge[i].nxt)
int v = edge[i].to;
if (vis[v] == 1&&v != fa)
low[u] = min (low[u],dfn[v]);
if (vis[v] == 0)
{
Tarjan (v,u);
son ++;
low[u] = min (low[u],low[v]);
if ((u == root&&son
> 1)||(u !=
root&&dfn[u] <=
low[v]))
cut[u]
++;
//cut[u] 表示u这个点割边数
}
2;
}
int main ()
{
i,n,m,u,v;
("%d%d",&n,&m)&&n)
if (m == 0)
{
printf ("%d\n",n-1);
continue;
}
memset (head,0xFF,sizeof(head));
memset (vis,0,sizeof(vis));
memset (cut,0,sizeof(cut));
memset (dfn,0,sizeof(dfn));