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 = 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判割点相关推荐
- POJ 3713 Transferring Sylla 题解 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 3713 Transferring Sylla三连通图:判断一个无向图是否三连通?3.5借助水流解决问题的网络流最大流刷个题报 ...
- tarjan算法 割点割边强联通 算法讲解模板 自用整理
很早就学过tarjan算法(割点割边与强联通)了,但是因为久不用老是忘,也有收藏过几篇不错的博客,但是每次需要时都要翻出那几篇太麻烦了,所以自己开篇记录方便自己的复习.图片和部分文字来源自其他博客,文 ...
- tarjan求割点和桥(割边)模板
tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边.两条边互为反向边. 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树, ...
- tarjan求割点和桥(割边)
tarjan求割点和桥 参考博客:tarjan求割点和桥(割边) 例题:割点 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll l ...
- POJ 3713 枚举 + Tarjan 割点
题意 传送门 POJ 3713 题解 白书里归到最大流最小割,Emmmm没有找到复杂度比较低的方法.虽然通道节点不相交可以转化为节点容量为 1,通过拆成 2 个节点并连边转化成最大流问题,但要枚举每一 ...
- hdu 4587 TWO NODES 暴力枚举+tarjan
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意是拿掉两个点 求最多可以把整个图分成几个联通块 注意到有一个模板是可以通过找割点来快速求出 ...
- tarjan算法 (割点和桥)
最近刚学习了tarjan算法,发一篇博客写一下自己的心得和理解. 在了解割点和桥之前,我们先理解什么是双连通. 双连通和强连通分别是应用于无向图和有向图中的,那么在学习双连通之前,请自行学习求强连通分 ...
- Tarjan求割点桥
概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中,如果删 ...
- BZOJ 1565 Luogu P2805 [NOI2009]植物大战僵尸 (Tarjan判环、最小割)
我: "立个flag 14点之前调完这题" 洛谷AC时间: 2019-06-24 14:00:16 实力打脸... 网络流板子从来写不对系列 题目链接: (BZOJ) https: ...
最新文章
- 互联网协议 — Non-IP 网络架构
- Docker镜像的基本操作
- 开启mysql慢查询日志,不重启数据库的方法
- kafka查看topic中的数据_实战!Kafka Manager能统计出Topic中的记录条数吗?
- 《操作系统》实验报告——进程调度的模拟
- python生成数据
- 倍增:st表(模板)(洛谷P3865)
- JDK源码解析之 java.lang.System
- Java基础学习总结(87)——坚持写Java等技术类博客的好处
- 【Servlet笔记】Servlet入门
- java.lang.Exception: Test class should have exactly one public constructor
- android 实体对象转 json,list转 json ,map转json
- c语言编写英雄联盟,怎么用C#或者C语言注册 英雄联盟 热键
- torch.randn 方法
- 温暖的奢侈,当手机遇到机器人
- gradient clipping
- 朗伯余弦定律(Lambert‘s Cosine Law)
- 对于阿里云手机 OS 大家都怎么看?
- matplotlib 进阶之Artist tutorial(如何操作Atrist和定制)
- 华为 mac地址防护
热门文章
- linux中文系统换英文字体,linux系统下肿么切换字体?
- do还是doing imagine加to_啤酒,还是精酿好
- Hot Door CADtools (基础篇)
- 电脑基础操作_苹果电脑基础操作,和使用须知
- yum出错Error: Cannot find a valid baseurl for repo: base
- ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times
- python实现最长公共子序列的求解
- U盘里的文件夹会以应用程序的方式出现解决
- 【Transformer】SMCA: Fast Convergence of DETR with Spatially Modulated Co-Attention
- 模型 标签数据 神经网络_大型神经网络和小数据的模型选择