现在的位置: 首页 > 综合 > 正文

poj 2117 Electricity(割点)

2018年03月17日 ⁄ 综合 ⁄ 共 1115字 ⁄ 字号 评论关闭
题意:有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));
     

抱歉!评论已关闭.