其实就是判断是否为三连通图

三连通图指的是去掉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判割点的更多相关文章

  1. POJ 3713 Transferring Sylla【Tarjan求割点】

    题意:给出一个无向图,判断是否任意两点间都存在至少3条互相独立的路,独立指公共顶点只有起点和终点.算法:枚举每个点,删去后用Tarjan判断图中是否存在割点,如果存在则该图不满足三连通性.Tarjan ...

  2. 【bzoj1123】【[POI2008]BLO】tarjan判割点

    (上不了p站我要死了,侵权度娘背锅) Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有t ...

  3. poj Transferring Sylla(怎样高速的推断一个图是否是3—连通图,求割点,割边)

    Transferring Sylla 首先.什么是k连通图? k连通图就是指至少去掉k个点使之不连通的图. 题目: 题目描写叙述的非常裸.就是给你一张图要求你推断这图是否是3-连通图. 算法分析: / ...

  4. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  5. [POJ1144][BZOJ2730]tarjan求割点

    求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...

  6. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  7. POJ 3713 Transferring Sylla (三联通分量)

    Transferring Sylla Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3533   Accepted: 988 ...

  8. 图论分支-Tarjan初步-割点和割边

    所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...

  9. UOJ67 新年的毒瘤【Tarjan,割点】

    Online Judge:#uoj 67 Label:Tarjan,割点,细节 题目描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树.这个长着毒瘤的树可以用\(n\)个结点 ...

随机推荐

  1. python dict.fromkeys()研究

    def unique(seq): #return [x for x in my_list if x not in locals()['_[1]']] return {}.fromkeys(seq).k ...

  2. struts2学习笔记(3)struts.xml的一些常用设置

    在开发中通常需要用到多个配置文件,可以通过在web.xml中添加以下代码: <include file="login.xml"></include> 将sr ...

  3. import gevent 协程 import greenlet

  4. go语言-工作区和gopath

    工作区是放置Go源码文件的目录;一般情况下,Go源码文件都需要存放到工作区中;但是对于命令源码文件来说,这不是必须的. 每一个工作区的结构都类似下图所示:/home/hypermind/golib: ...

  5. Struts第三天

    OgnlValueStack贯穿整个 Action 的生命周期. 它是ContextMap中的一部分,里面的结构是一个List,是我们可以快速访问数据一个容器.它的封装是由struts2框架完成的. ...

  6. HDU 1796 How many integers can you find (容斥)

    题意:给定一个数 n,和一个集合 m,问你小于的 n的所有正数能整除 m的任意一个的数目. 析:简单容斥,就是 1 个数的倍数 - 2个数的最小公倍数 + 3个数的最小公倍数 + ...(-1)^(n ...

  7. 第6章 jQuery与Ajax的应用

    6.1 Ajax的优势和不足 6.1.1 Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高Web程序的性能 Ajax模式只是通过XMLHttpRequest对象向服务器端提交希望提交的 ...

  8. C++: I/O流详解(三)——串流

    一.串流 串流类是 ios 中的派生类 C++的串流对象可以连接string对象或字符串 串流提取数据时对字符串按变量类型解释:插入数据时把类型 数据转换成字符串 串流I/O具有格式化功能 例: #i ...

  9. 用LINQ获取XML节点数据

    Insus.NET想对<从字符串中获取XML节点数据> http://www.cnblogs.com/insus/p/3299052.html 这篇改写为使用LINQ的方法实现.LINQ中 ...

  10. 人工智能热门图书(深度学习、TensorFlow)免费送!

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 这个双十一,人工智能市场火爆,从智能音箱到智能分拣机器人,人工智能已逐渐渗透到我们的生活的方方面面.网易云社区联合博文视点为大家带来人工智能热门图书 ...