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

三连通图指的是去掉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 = 20010;
int cnt,flag,times,del,root;
int head[maxn],low[maxn],dfn[maxn];
struct no
{int v,next;
}Eg[2*maxn];
void init( )
{cnt=0;memset(head,-1,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=0;low[u] = dfn[u] = ++times;for(int i=head[u] ; i!=-1 ; 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>1)||(u!=root&&low[v]>=dfn[u]))flag=1;}elselow[u]=min(low[u],dfn[v]);}
}
int main( )
{int n,m;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;init();for(int i=0 ; i<m ; i++){int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);}flag=0;for(int i=0 ; i<n ; i++){del = i ; times = 0;memset(dfn,0,sizeof(dfn));root = 0;if(del==0)root=1;dfn[del] = 1;dfs(root,-1);for(int j=0 ; j<n ; j++){if(!dfn[j]){flag=1;break;}}if(flag)break;}if(flag)puts("NO");elseputs("YES");}return 0;}

View Code

转载于:https://www.cnblogs.com/shuaihui520/p/9309461.html

poj3713 Transferring Sylla 枚举+tarjan判割点相关推荐

  1. POJ 3713 Transferring Sylla​ 题解 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3713 Transferring Sylla三连通图:判断一个无向图是否三连通?3.5借助水流解决问题的网络流最大流刷个题报 ...

  2. tarjan算法 割点割边强联通 算法讲解模板 自用整理

    很早就学过tarjan算法(割点割边与强联通)了,但是因为久不用老是忘,也有收藏过几篇不错的博客,但是每次需要时都要翻出那几篇太麻烦了,所以自己开篇记录方便自己的复习.图片和部分文字来源自其他博客,文 ...

  3. tarjan求割点和桥(割边)模板

    tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边.两条边互为反向边. 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树, ...

  4. tarjan求割点和桥(割边)

    tarjan求割点和桥 参考博客:tarjan求割点和桥(割边) 例题:割点 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll l ...

  5. POJ 3713 枚举 + Tarjan 割点

    题意 传送门 POJ 3713 题解 白书里归到最大流最小割,Emmmm没有找到复杂度比较低的方法.虽然通道节点不相交可以转化为节点容量为 1,通过拆成 2 个节点并连边转化成最大流问题,但要枚举每一 ...

  6. hdu 4587 TWO NODES 暴力枚举+tarjan

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意是拿掉两个点 求最多可以把整个图分成几个联通块 注意到有一个模板是可以通过找割点来快速求出 ...

  7. tarjan算法 (割点和桥)

    最近刚学习了tarjan算法,发一篇博客写一下自己的心得和理解. 在了解割点和桥之前,我们先理解什么是双连通. 双连通和强连通分别是应用于无向图和有向图中的,那么在学习双连通之前,请自行学习求强连通分 ...

  8. Tarjan求割点桥

    概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中,如果删 ...

  9. BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)

    我: "立个flag 14点之前调完这题" 洛谷AC时间: 2019-06-24 14:00:16 实力打脸... 网络流板子从来写不对系列 题目链接: (BZOJ) https: ...

最新文章

  1. 互联网协议 — Non-IP 网络架构
  2. Docker镜像的基本操作
  3. 开启mysql慢查询日志,不重启数据库的方法
  4. kafka查看topic中的数据_实战!Kafka Manager能统计出Topic中的记录条数吗?
  5. 《操作系统》实验报告——进程调度的模拟
  6. python生成数据
  7. 倍增:st表(模板)(洛谷P3865)
  8. JDK源码解析之 java.lang.System
  9. Java基础学习总结(87)——坚持写Java等技术类博客的好处
  10. 【Servlet笔记】Servlet入门
  11. java.lang.Exception: Test class should have exactly one public constructor
  12. android 实体对象转 json,list转 json ,map转json
  13. c语言编写英雄联盟,怎么用C#或者C语言注册 英雄联盟 热键
  14. torch.randn 方法
  15. 温暖的奢侈,当手机遇到机器人
  16. gradient clipping
  17. 朗伯余弦定律(Lambert‘s Cosine Law)
  18. 对于阿里云手机 OS 大家都怎么看?
  19. matplotlib 进阶之Artist tutorial(如何操作Atrist和定制)
  20. 华为 mac地址防护

热门文章

  1. linux中文系统换英文字体,linux系统下肿么切换字体?
  2. do还是doing imagine加to_啤酒,还是精酿好
  3. Hot Door CADtools (基础篇)
  4. 电脑基础操作_苹果电脑基础操作,和使用须知
  5. yum出错Error: Cannot find a valid baseurl for repo: base
  6. ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times
  7. python实现最长公共子序列的求解
  8. U盘里的文件夹会以应用程序的方式出现解决
  9. 【Transformer】SMCA: Fast Convergence of DETR with Spatially Modulated Co-Attention
  10. 模型 标签数据 神经网络_大型神经网络和小数据的模型选择