题目链接http://poj.org/problem?id=2117

题目大意:在一个非连通图中,求一个切除图中任意一个割点方案,使得图中连通分量数最大。

解题思路

一个大陷阱,m可以等于0,这时候要特判,结果就是n-1。

同时出题者脑子秀逗了,也不给C的范围。我开了两倍点大小RE了,于是怒开了五倍点大小才A了。

本题不是连通图,需要先计算原始图中的连通分量。方法就是dfs染色。

然后dfs求割点。

之后枚举割点,由于是非连通图,所以连通分量数=原始分量数+block-1。

-1的原因是,每次相当于对其中一个连通分量计算,加上新的block之后,所以要减-1。

#include "cstdio"
#include "cstring"
#include "vector"
using namespace std;
#define maxn 10005
struct Edge
{
int to,next;
}e[maxn*];
int dfs_clock,pre[maxn],block,head[maxn],tol;
bool cut[maxn],vis[maxn];
void addedge(int u,int v)
{
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol++;
}
int dfs(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
int child=;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].to;
if(!pre[v])
{
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(lowv>=pre[u]) cut[u]=true;
}
else if(pre[v]<pre[u]&&v!=fa) lowu=min(lowu,pre[v]);
}
if(fa<&&child==) cut[u]=false;
return lowu;
}
void check(int u,int fa)
{
vis[u]=true;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].to;
if(!vis[v])
{
if(u==fa) block++;
check(v,fa);
}
}
}
void link(int u) //判断初始连通分量
{
vis[u]=true;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].to;
if(!vis[v]) link(v);
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m,u,v;
while(scanf("%d%d",&n,&m)&&n)
{
memset(head,-,sizeof(head));
memset(pre,,sizeof(pre));
memset(cut,false,sizeof(cut));
dfs_clock=;tol=;
if(m==) printf("%d\n",n-); //特判
else
{
for(int i=; i<=m; i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
int res=,tt=;
for(int i=; i<n; i++) if(!vis[i]) {tt++;link(i);}
memset(vis,false,sizeof(vis));
for(int i=; i<n; i++) if(!pre[i]) dfs(i,-);
res=tt;
for(int i=; i<n; i++)
{
if(cut[i])
{
check(i,i);
if(tt) res=max(res,block+tt-);
block=;
memset(vis,false,sizeof(vis));
}
}
printf("%d\n",res);
}
}
}
2905876 neopenx POJ 2117 Accepted 732 2422 C++ 2129  

POJ 2117 (割点+连通分量)的更多相关文章

  1. poj 2117(割点的应用)

    题目链接:http://poj.org/problem?id=2117 思路:题目的意思是要求对于给定的无向图,删除某个顶点后,求最大的连通分量数.显然我们只有删掉割点后,连通分支数才会增加,因此我们 ...

  2. POJ 1523 (割点+连通分量)

    题目链接:http://poj.org/problem?id=1523 题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数. 解题思路: POJ的数据很弱. Tarjan法求割点. ...

  3. Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题

    Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...

  4. POJ 2117 Electricity(割点求连通分量)

    http://poj.org/problem?id=2117 题意:求删除图中任意一个顶点后的最大连通分量数. 思路: 求出每个割点对应的连通分量数,注意这道题目中图可能是不连通的. 这道题目我wa了 ...

  5. POJ 2117 Electricity 双联通分量 割点

    http://poj.org/problem?id=2117 这个妹妹我竟然到现在才见过,我真是太菜了~~~ 求去掉一个点后图中最多有多少个连通块.(原图可以本身就有多个连通块) 首先设点i去掉后它的 ...

  6. poj 2117 Electricity(tarjan求割点删掉之后的连通块数)

    题目链接:http://poj.org/problem?id=2117 题意:求删除一个点后,图中最多有多少个连通块. 题解:就是找一下割点,根节点的割点删掉后增加son-1(son为子树个数),非根 ...

  7. poj 2117 去掉割点可以分得的联通图的个数模板

    #include<stdio.h> #include<string.h> #define N 11000 /* 去掉一个割点后,询问可以分得的联通图的个数 */ struct ...

  8. poj 1144(割点)

    题目链接:http://poj.org/problem?id=1144 题意:给出一个无向图,求关键节点的个数. 分析:双连通分量Tarjan算法直接求割点就行了,裸的模板题. AC代码: #incl ...

  9. poj 3177 边连通分量

    思路: dfs求出所有点的low值,然后对每个连通分量进行缩点,可以通过low来进行缩点.虽然在同一连通分量里可能存在不同的low值,但这并不影响缩点.将每个连通分量缩为一个点后,只要求出这个缩点后的 ...

随机推荐

  1. php用soap创建webservice

    php提供了一个专门用于soap操作的扩展库,使用该扩展库后 可以直接在php中进行soap操作.下面将介绍soap的基本操作. 一.soap扩展的使用方法 php的soap扩展库通过soap协议实现 ...

  2. 对大一新生开始学习C语言课程谈几点看法

    大家好,首先祝贺大家进入了大学,迈入了大学的校门,也意味着开始了新的征程,希望大家能够有一个美好的大学四年. 先做下自我介绍,我叫李帅阳,(大家可以称呼我 李老师,或是班助,或是...)这是在邹欣老师 ...

  3. poj3295

    Tautology Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10453   Accepted: 3967 Descri ...

  4. sort如何按指定的列排序

    <1>[root@localhost company]# cat test 06d7            145             4192542506e1            ...

  5. 如何选择Html.RenderPartial和Html.RenderAction

    Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. Html.RenderPartial是直接将用户控件嵌入到界面上: <%Htm ...

  6. BASH相关

    颜色 http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html http://segmentfault.com/q/10100000 ...

  7. Java for LeetCode 142 Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  8. BestCoder18 1002.Math Problem(hdu 5105) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得 ...

  9. Java 复制文件的高效方法

    转载自:http://jingyan.baidu.com/article/ff4116259c2d7712e4823780.html 在Java编程中,复制文件的方法有很多,而且经常要用到.我以前一直 ...

  10. javascript ASCII和Hex互转

    <script> var symbols = " !\"#$%&'()*+,-./0123456789:;<=>?@"; var loAZ ...