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\)个结点 ...
随机推荐
- springJunit测试
; m.setModelType(s); m.setModelUrlType(s); modelService.create(m); } } 来源: http://enki-ding-yeah-n ...
- 《Android应用性能优化》 第5章 多线程和同步
1.DDMS中可以看见的系统线程(Andorid3.1的Galaxy Tab 10.1为例): main HeapWorker 执行finalize函数和引用对象清理 GC Garbage Colle ...
- 【总结整理】IFeatureBuffer
IFeatureBuffer pRowBuffer = objTabWYDCQ_Tar.CreateFeatureBuffer(); pRowBuffer.Shape = SourceRow.Shap ...
- 详解CSS盒模型(转)
详解CSS盒模型 阅读目录 一些基本概念 盒模型 原文地址:http://luopq.com/2015/10/26/CSS-Box-Model/ 本文主要是学习CSS盒模型的笔记,总结了一些基本概 ...
- HDU 4879 ZCC loves march (并查集,set,map)
题面以及思路:https://blog.csdn.net/glqac/article/details/38402101 代码: #include <bits/stdc++.h> #defi ...
- Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
题意:题目中定义了一种运算,把数字x变成数字x的二进制位数.问小于n的恰好k次运算可以变成1的数的个数(题目中的n是二进制数,n最大到2^1000) 思路:容易发现,无论多么大的数,只要进行了一次运算 ...
- js转化与排序
1.对象转化为数组 object.keys() var obj={a:3,b:7,c:8,d:false} alert(Object.keys(obj)) 注意此函数会把对象的key转化为数组 spl ...
- JS jquery ajax 已看1 有用
4.form中的input可以设置为readonly和disable,请问2者有什么区别? readonly不可编辑,但可以选择和复制:值可以传递到后台 disabled不能编辑,不能复制,不能选择: ...
- rpush()
批量插入多个value,并为消息队列模式 $pipe->rpush($key,$vlaues);//$values是多个value组成的一个数组
- Python程序设计7——文件读写
1 文件读写简介 文件读写是应用程序中的常用操作.下面介绍Python中进行文件读写.Python的文件读写是非常简单的. 1.1 open函数 open函数一般有了两个必须参数,一个是文件名参数,另 ...