题意:有N个核电站,问去掉一个点,最多能使N个核电站分成几部份?
思路:求出去每去掉每个割点子图被分成的个数,取其中最大的。再加上原来有多少个图。
//864K
547MS
#include <stdio.h>
#include <string.h>
#define M 10010
struct data
{
int 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)
{
edge[e].to = cv;
edge[e].nxt = head[cu];
head[cu] = e ++;
}
int min (int a,int b)
{
return a > b ? b : a;
}
int max (int a, int b)
{
return a > b ? a : b;
}
void Tarjan (int u,int fa)
//割点模板
{
int son = 0;
vis[u] = 1;
dfn[u] = low[u] = ++cnt;
for (int i = 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这个点割边数
}
}
vis[u] = 2;
}
int main ()
{
int i,n,m,u,v;
while (scanf ("%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));
e = 0;
while (m --)
{
scanf ("%d%d",&u,&v);
addedge (u,v);
addedge (v,u);
}
int ans = 0;
int Max = 0;
for (i = 0;i < n;i ++)
{
if (!dfn[i])
{
ans ++;
cnt = 0;
root = i;
Tarjan (i,-1);
}
Max = max (Max,cut[i]);
//取最大的
}
printf ("%d\n",ans + Max);
}
return 0;
}
思路:求出去每去掉每个割点子图被分成的个数,取其中最大的。再加上原来有多少个图。
//864K
#include <stdio.h>
#include <string.h>
#define M 10010
struct data
{
}edge[M*3];
int head[M],vis[M],dfn[M],low[M],cut[M];
int cnt,e,root;
void addedge (int cu,int cv)
{
}
int min (int a,int b)
{
}
int max (int a, int b)
{
}
void Tarjan (int u,int fa)
{
}
int main ()
{
}