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

三连通图指的是去掉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 ; }

最新文章

  1. 学习sql中的排列组合,在园子里搜着看于是。。。
  2. BZOJ2242 [SDOI2011]计算器
  3. Hibernate原理解析-Hibernate中实体的状态
  4. 窗口 - dialog - 与后端交互
  5. 计算hashCode的常见方法
  6. [iOS翻译]《iOS7 by Tutorials》系列:iOS7的设计精髓(下)
  7. Visual Studio Ultimate 2013 with Update 4
  8. 如何判断raid1中哪块硬盘损坏?
  9. .net core demo &amp; docker images
  10. HTML5-常见的事件- contextmenu 事件
  11. CSS基础布局--居中对齐,左侧定宽右侧自适应
  12. undefined is not an object (evaluating &#39;RNFetchBlob.DocumentDir&#39;)
  13. Hadoop MR编程
  14. 关于jQuery中的trigger和triggerHandler方法的使用
  15. Ubuntu18.04美化主题(mac主题)
  16. Android——MaterialDesign之二DrawerLayout
  17. System.Data.Entity.Internal.AppConfig&quot;的类型初始值设定项引发异常
  18. [POI2004] SZN
  19. Android四大组件应用系列——使用BroadcastReceiver和Service实现倒计时
  20. Docker 配置阿里云镜像加速器

热门文章

  1. lombok与spring的恩怨
  2. jstl 判断 null
  3. 两种布局的ListVIew Adapter。例如微信对话界面
  4. Android基础学习:Android环境搭建
  5. 数据库开源框架ormlite
  6. Go语言-变量和常量
  7. cocos2dx中的内存管理方式
  8. ES02 变量、数组、对象、方法
  9. android json解析(JSONObject方法实现)
  10. little case1