UVA-315 无向图求割点个数
题意抽象:
给定一个无向图,输出割点个数。
割点定义:删除该点后,原图变为多个连通块。
考虑一下怎么利用tarjan判定割点:
对于点u和他相连的当时还未搜到的点v,dfs后如果DFN[u]<=low[v],那么u是割点。(搜v得到的是一个不会倒卷回来的子图)
另外注意一下tarjan搜索时的起始点如果有多个儿子那么它也是割点。
AC代码:
#include<cstdio>
#include<cstring>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=;
const int MAXM=*;
int tot=;
int pointer[MAXN],DFN[MAXN],low[MAXN];
bool instack[MAXN];
int Stap[MAXN];
int Stop,cnt=,n;
int par[MAXN];bool iscut[MAXN];
int add_block[MAXN];
struct Edge
{
int to,next,vis;
Edge() {}
Edge(int b,int nxt,int visit) {to=b;next=nxt,vis=visit;}
}edge[MAXM];
inline void addedge(int a,int b)
{
edge[tot]=Edge(b,pointer[a],);
pointer[a]=tot++;
edge[tot]=Edge(a,pointer[b],);
pointer[b]=tot++;
}
void init()
{
memset(pointer,-,sizeof(pointer));
memset(par,-,sizeof(par));
memset(iscut,,sizeof(iscut));
memset(DFN,,sizeof(DFN));
memset(add_block,,sizeof(add_block));
tot=;cnt=;
int k,u;char c;
while(scanf("%d",&u)&&u)
{
while(scanf("%d%c",&k,&c)&&k)
{
addedge(u,k);
if(c=='\n') break;
}
}
}
void tarjan(int u,int pre)
{
int son=;
DFN[u]=low[u]=++cnt;
for(int j=pointer[u];j!=-;j=edge[j].next)
{
int v=edge[j].to;
if(edge[j].vis) continue;
edge[j].vis=;
edge[j^].vis=;
if(!DFN[v])
{
son++;
par[v]=j;
tarjan(v,u);
if(low[v]<low[u]) low[u]=low[v];
if(DFN[u]<=low[v]&&u!=pre)
{
iscut[u]=;
add_block[u]++;
}
}
else if(DFN[v]<low[u]) low[u]=DFN[v];
}
if(u==pre&&son>) iscut[u]=;
if(u==pre) add_block[u]=son-;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
init();
rep(i,,n) if(!DFN[i]) tarjan(i,i);
int ans=;
rep(i,,n) if(iscut[i]) ans++;
printf("%d\n",ans);
}
return ;
}
UVA-315 无向图求割点个数的更多相关文章
- B - Network - uva 315(求割点)
题意:给一个无向连通图,求出割点的数量. 首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式). 分析:割点的模板题 ...
- Network UVA - 315 无向图找割点
题意: 给你一个无向图,你需要找出来其中有几个割点 割点/割项: 1.u不为搜索起点,low[v]>=dfn[u] 2.u为搜索起点,size[ch]>=2 3.一般情况下,不建议在tar ...
- Network UVA - 315(求割点)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- UVA 315 Network (模板题)(无向图求割点)
<题目链接> 题目大意: 给出一个无向图,求出其中的割点数量. 解题分析: 无向图求割点模板题. 一个顶点u是割点,当且仅当满足 (1) u为树根,且u有多于一个子树. (2) u不为树根 ...
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 315 315 - Network(求割点个数)
Network A Telephone Line Company (TLC) is establishing a new telephone cable network. They are con ...
- 无向图求割点 UVA 315 Network
输入数据处理正确其余的就是套强联通的模板了 #include <iostream> #include <cstdlib> #include <cstdio> #in ...
- B - Network---UVA 315(无向图求割点)
A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connectin ...
- POJ1144Network(求割点个数)
题目链接 题意:一共n割点,然后若干行,每行第一个输入一个点,然后若干个点表示与他相连,0单独一行表示一个样例的结束.然后求图中的割点个数 割点:去掉该点之后得到的图不在连通,那么该店就是割点 一般割 ...
随机推荐
- onclick 事件
onclick 事件 Event 对象 定义和用法 onclick 事件会在对象被点击时发生. 请注意, onclick 与 onmousedown 不同.单击事件是在同一元素上发生了鼠标按下事件之后 ...
- Java三种注释
单行注释:// 注释内容 多行注释:/*... 注释内容....*/ 文本注释:/**.. 注释内容....*/ 这种注释可以用来自动地生成文档.在JDK中有个 ...
- Win10系统截屏快捷键
截全屏 win+prt scsysrq 图片位置:C:\Users\ASUS\Pictures\Screenshots 此电脑/图片/屏幕截图 截当前活动窗口 alt+prt scsysrq ...
- sublime text 3 显示空格和Tab
tab对于需要 共享 的代码而言是灾难. pyhton对这点的明确要求是不要混合使用4个空格和tab键. 只使用二者之一,都是没有问题的.如果一个python代码已经完成的部分,都是使用的4个空格.那 ...
- 如何进入docker 使用root用户的方式
docker exec -it --user root <container id> /bin/bash
- angular2-4 之动效-animation
提示: angular2 时animation代码在核心模块里面(@angular/core里面);到了angular4.0时animation从核心模块中提取出来作为一个单独的模块, 这样可以在 ...
- django中的中间件
中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责 ...
- Mysql按周,按月,按日,按小时分组统计数据
按周 select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks; ...
- Mysql优化系列之——优化器对子查询的处理
根据子查询的类型和位置不同,mysql优化器会对查询语句中的子查询采取不同的处理策略,其中包括改写为连接(join),改写为半连接(semi-join)及进行物化处理等. 标量子查询(Scalar S ...
- springboot整合mybatis遇到无法扫描MaperScan包的问题
1.启动类加上@MaperScan注解后,一直报错如下: Error creating bean with name 'platUserMapper' defined in file [D:\work ...