POJ 2117 (割点+连通分量)
题目链接: 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 (割点+连通分量)的更多相关文章
- poj 2117(割点的应用)
题目链接:http://poj.org/problem?id=2117 思路:题目的意思是要求对于给定的无向图,删除某个顶点后,求最大的连通分量数.显然我们只有删掉割点后,连通分支数才会增加,因此我们 ...
- POJ 1523 (割点+连通分量)
题目链接:http://poj.org/problem?id=1523 题目大意:连通图,找图中割点,并计算切除该割点后,图中的连通分量个数. 解题思路: POJ的数据很弱. Tarjan法求割点. ...
- Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...
- POJ 2117 Electricity(割点求连通分量)
http://poj.org/problem?id=2117 题意:求删除图中任意一个顶点后的最大连通分量数. 思路: 求出每个割点对应的连通分量数,注意这道题目中图可能是不连通的. 这道题目我wa了 ...
- POJ 2117 Electricity 双联通分量 割点
http://poj.org/problem?id=2117 这个妹妹我竟然到现在才见过,我真是太菜了~~~ 求去掉一个点后图中最多有多少个连通块.(原图可以本身就有多个连通块) 首先设点i去掉后它的 ...
- poj 2117 Electricity(tarjan求割点删掉之后的连通块数)
题目链接:http://poj.org/problem?id=2117 题意:求删除一个点后,图中最多有多少个连通块. 题解:就是找一下割点,根节点的割点删掉后增加son-1(son为子树个数),非根 ...
- poj 2117 去掉割点可以分得的联通图的个数模板
#include<stdio.h> #include<string.h> #define N 11000 /* 去掉一个割点后,询问可以分得的联通图的个数 */ struct ...
- poj 1144(割点)
题目链接:http://poj.org/problem?id=1144 题意:给出一个无向图,求关键节点的个数. 分析:双连通分量Tarjan算法直接求割点就行了,裸的模板题. AC代码: #incl ...
- poj 3177 边连通分量
思路: dfs求出所有点的low值,然后对每个连通分量进行缩点,可以通过low来进行缩点.虽然在同一连通分量里可能存在不同的low值,但这并不影响缩点.将每个连通分量缩为一个点后,只要求出这个缩点后的 ...
随机推荐
- 使用twisted.web实现代理服务器
简单的实现谷歌的代理: 架构就是下面这么简单. ================= my server outside GFW | <----------------------> ...
- ICMP-type对应表
一次在某个防火墙配置策略里看到如下的代码: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A FORWARD -p icmp ...
- 【云计算】开源的Docker Registry WebUI
kwk/docker-registry-frontend Code Issues 9 Pull requests 6 Wiki ...
- Java单链表、双端链表、有序链表实现
单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...
- 七维互联(www.7wei.com)
七维互联 http://www.7wei.com/ 黄云贵的Delphi http://www.cnblogs.com/huangygdelphi/articles/2232171.htm ...
- Java for LeetCode 028 Implement strStr()
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- codeforces A. IQ Test 解题报告
题目链接:http://codeforces.com/problemset/problem/328/A 一开始单纯地直接判断给出的序列是等差还是等比,连这一句“You should also prin ...
- JavaScript当离开页面时可以进行的操作
当JavaScript离开页面时可以进行的操作 window.onbeforeunload = function() { var email = document.getElementById(&qu ...
- Struts2 Action与Servlet API耦合
单元测试在开发中是非常重要的一个环节程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常 ...
- 大白菜U盘启动盘制作工具V5.0如何制作启动系统U盘
1:切换到ISO模式或者直接点击主程序左上角的ISO制作,程序会切换到ISO制作界面. 2:在路径里选好ios文件,点击按钮. 3:打开ISO模式的一键制作启动U盘,点击ISO模式里的按钮,按照图中推 ...