poj3713 Transferring Sylla 枚举+tarjan判割点
其实就是判断是否为三连通图
三连通图指的是去掉3个点就不连通的图,但是并没有直接求三连通的算法。著名的Tarjan算法可以求解连通和割点,再枚举删除一个点就能达到三连通的目的。
先看用例2,是由用例1去掉一条边而变成非三连通图的:
至少造成了2和3非三连通:
我们来思考如何推导出2和3非三连通,假设从上图中删除了节点0,通过Tarjan算法,我们可以发现节点1是割点:
那么只需删除从3到割点和从3到我们枚举删除的节点0的两条边,就可以将3和2分割开来:
才删除了两条边2和3就不连通了,这个图显然不是三连通图。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn = ;
int cnt,flag,times,del,root;
int head[maxn],low[maxn],dfn[maxn];
struct no
{
int v,next;
}Eg[*maxn];
void init( )
{
cnt=;
memset(head,-,sizeof(head));
}
void add(int form,int to)
{
Eg[cnt].v=to;Eg[cnt].next=head[form];head[form]=cnt++;
}
void dfs(int u,int fa)
{
if(flag)
return ;
int tot=;
low[u] = dfn[u] = ++times;
for(int i=head[u] ; i!=- ; i=Eg[i].next)
{
int v=Eg[i].v;
if(v==fa||v==del)
continue;
if(!dfn[v])
{
tot++;
dfs(v,u);
low[u]=min(low[u],low[v]);
//判断割点
if((u==root&&tot>)||(u!=root&&low[v]>=dfn[u]))
flag=;
}
else
low[u]=min(low[u],dfn[v]);
}
}
int main( )
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)
break;
init();
for(int i= ; i<m ; i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
flag=;
for(int i= ; i<n ; i++)
{
del = i ; times = ;
memset(dfn,,sizeof(dfn));
root = ;
if(del==)
root=;
dfn[del] = ;
dfs(root,-);
for(int j= ; j<n ; j++)
{
if(!dfn[j])
{
flag=;
break;
}
}
if(flag)
break;
}
if(flag)
puts("NO");
else
puts("YES");
}
return ; }
poj3713 Transferring Sylla 枚举+tarjan判割点的更多相关文章
- POJ 3713 Transferring Sylla【Tarjan求割点】
题意:给出一个无向图,判断是否任意两点间都存在至少3条互相独立的路,独立指公共顶点只有起点和终点.算法:枚举每个点,删去后用Tarjan判断图中是否存在割点,如果存在则该图不满足三连通性.Tarjan ...
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
(上不了p站我要死了,侵权度娘背锅) Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有t ...
- poj Transferring Sylla(怎样高速的推断一个图是否是3—连通图,求割点,割边)
Transferring Sylla 首先.什么是k连通图? k连通图就是指至少去掉k个点使之不连通的图. 题目: 题目描写叙述的非常裸.就是给你一张图要求你推断这图是否是3-连通图. 算法分析: / ...
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
- [POJ1144][BZOJ2730]tarjan求割点
求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...
- 洛谷P3388 【模板】割点(割顶)(tarjan求割点)
题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...
- POJ 3713 Transferring Sylla (三联通分量)
Transferring Sylla Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3533 Accepted: 988 ...
- 图论分支-Tarjan初步-割点和割边
所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...
- UOJ67 新年的毒瘤【Tarjan,割点】
Online Judge:#uoj 67 Label:Tarjan,割点,细节 题目描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树.这个长着毒瘤的树可以用\(n\)个结点 ...
随机推荐
- python+requests+excel 接口测试
1.EXCEL文件接口保存方式,如图. 2.然后就是读取EXCEL文件中的数据方法,如下: import xlrd class readExcel(object): def __init__(self ...
- eclipse 报错:GC overhead limit exceeded
还是eclipse内存问题 修改eclipse.ini -Xms512m -Xmx1024m 必要的情况下, 添加 -XX:MaxPermSize=1024M 表示在编译文件时一直占有最大内存
- eclipse 中使用 GreenUML 和 AmasterasUML 自动生成类图
Green UML和AmaterasUML 两种 一.安装方法: 1.都是先安装GEF 通过eclipse-> install new software安装GEF的网址: http://down ...
- PROCEDURE存储过程传入表参数
) ,itemNum ) ,itemQty )) ---2.创建一个存储过程以表值参数作为输入 alter proc usp_TestProcWithTable @tb LocationTa ...
- ava的打包jar、war、ear包的作用、区别、打包方式
编为大家介绍,基于Java的打包jar.war.ear包的作用与区别详解.需要的朋友参考下以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.class文件,每个文件中的 ...
- ???Struts2框架03 session的使用、登录逻辑【session工作原理】
1 登录逻辑 1.1 获取登录数据(例如:用户名.密码) 1.2 在控制层调用业务层来验证数据信息 1.3 登录成功:保存用户信息(服务器用session.浏览器用cookie),跳转到主页面 1.4 ...
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- Opengl创建几何实体——四棱锥和立方体
//#include <gl\glut.h>#include <GL\glut.h>#include <iostream> using namespace std; ...
- 【摘自张宴的"实战:Nginx"】try_files指令
语法:try_files param1 [param2...paramN] fallback 默认值:none 使用环境: location 该指令用于告诉nginx测试每个文件是否存在,并且使用首先 ...
- 一道java笔试题目:Vector和ArrayList的区别
Vector和ArrayList的区别 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构这些类均在java.util包中本文试图通过 ...