图论分支-Tarjan初步-点双连通分量
上一次我们讲到了边双,这次我们来看点双。
说实话来说,点双比边双稍微复杂一些;
学完边双,我们先看一道题
第一问都不用说了吧,多余的道路,明显的割边。
是不是首先想到用边双,但是我们来看一个图:
有点丑,但是凑活看吧。
它是一个边双,但是!!!!它竟然没有冲突的边!!!
此时我们就要用点双了(是不是想打死我,竟然没讲,先坑人)
先看概念
都说概念是非常重要的,但是概念似乎有点笼统,可以附图解说
点双的一大特点是它可以重复用点,而那个点就是割点,而我们的缩点操作也是用割点连接各个点双的。
那么我们来看算法,我们在Tarjan时,用栈去维护点双,之后用vector去储存。
我们直接来看上面的题,就会明白这不是点双吗?
然后寻找规律,我们会发现,每一个点双中,只要边个数大于点个数,那么这里的边都是冲突的,那么我们的Code就跃然纸上了
- #include<bits/stdc++.h>
- #define maxn 10007
- #define M 100007
- using namespace std;
- int n,m,cent=,t,head[maxn],low[maxn],dfn[maxn],ans1,ans2;
- int stackk[maxn],cnt,top,root,cut[maxn],col[maxn],vis[maxn];
- int ol;
- vector<int >dcc[maxn];
- struct node{
- int next,to;
- }edge[M*];
- inline void add(int u,int v){
- edge[++cent]=(node){head[u],v};head[u]=cent;
- }
- void Tarjan(int x,int fa){
- dfn[x]=low[x]=++t;
- stackk[++top]=x;//入栈
- if(x==root&&head[x]==){//不联通时的孤立点
- dcc[++cnt].push_back(x);
- return ;
- }
- for(int i=head[x];i;i=edge[i].next){
- int y=edge[i].to;
- if(!dfn[y]){
- Tarjan(y,i);
- low[x]=min(low[x],low[y]);//与其他的一样
- if(low[y]>=dfn[x]){
- if(low[y]>dfn[x]) ans1++;//记录割边个数
- int z;cnt++;
- do{
- z=stackk[top--];//从栈中取出
- dcc[cnt].push_back(z);//存入
- }while(z!=y);//停止条件,这个可以想一想为什么
- dcc[cnt].push_back(x);//把割点也存进去
- }
- }else if((i^)!=fa) low[x]=min(low[x],dfn[y]);
- }
- }
- void clear(){
- ans1=ans2=top=cnt=t=ol=;cent=;
- memset(head,,sizeof head);
- memset(low,,sizeof low);
- memset(dfn,,sizeof dfn);
- memset(stackk,,sizeof stackk);
- memset(dcc,,sizeof dcc);
- memset(col,,sizeof col);
- memset(edge,,sizeof edge);
- }
- int main(){
- // freopen("way.in","r",stdin);
- // freopen("way.out","w",stdout);
- while(scanf("%d%d",&n,&m)){
- if(n==&&m==)break;
- clear();
- int a,b;
- for(int i=;i<=m;i++){
- scanf("%d%d",&a,&b);
- add(a+,b+),add(b+,a+);//由于点从零开始,那么我们+1即可
- }
- for(int i=;i<=n;i++){
- if(!dfn[i]) root=i,Tarjan(i,-);
- }
- for(int i=;i<=cnt;i++,ol=){
- for(int j=;j<dcc[i].size();j++){
- vis[dcc[i][j]]=;//记录点双上的点
- }
- for(int k=;k<dcc[i].size();k++){
- for(int j=head[dcc[i][k]];j;j=edge[j].next){
- if(vis[edge[j].to]) ol++;//ol统计边数
- }
- }
- if(ol/>dcc[i].size()) ans2+=ol/;//由于是双向边,ol会统计量词
- memset(vis,,sizeof(vis));
- }
- printf("%d %d\n",ans1,ans2);
- }
- }
那么我们就应该懂了一些基本的概念,和简单的操作,那么,留一个彩蛋,我们该如何去缩点连接呢?
图论分支-Tarjan初步-点双连通分量的更多相关文章
- 图论分支-Tarjan初步-边双联通分量
本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...
- 图论分支-Tarjan初步-割点和割边
所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...
- hdu 2460(tarjan求边双连通分量+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- C++[Tarjan求点双连通分量,割点][HNOI2012]矿场搭建
最近在学图论相关的内容,阅读这篇博客的前提是你已经基本了解了Tarjan求点双. 由割点的定义(删去这个点就可使这个图不连通)我们可以知道,坍塌的挖煤点只有在割点上才会使这个图不连通,而除了割点的其他 ...
- Tarjan求点双连通分量
概述 在一个无向图中,若任意两点间至少存在两条“点不重复”的路径,则说这个图是点双连通的(简称双连通,biconnected) 在一个无向图中,点双连通的极大子图称为点双连通分量(简称双连通分量,Bi ...
- tarjan复习笔记 双连通分量,强连通分量
声明:图自行参考割点和桥QVQ 双连通分量 如果一个无向连通图\(G=(V,E)\)中不存在割点(相对于这个图),则称它为点双连通图 如果一个无向连通图\(G=(V,E)\)中不存在割边(相对于这个图 ...
- Codeforces Beta Round #89 (Div. 2) E. Bertown roads(Tarjan、边双连通分量)
题目链接:http://codeforces.com/problemset/problem/118/E 思路:首先要判断图是否是边双连通,这个Tarjan算法可以判断,若low[v] > dfn ...
- 6409. 【NOIP2019模拟11.06】困难的图论(Tarjan求点双)
题目描述 Description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在 ...
随机推荐
- 在一般类中通过XmlWebApplicationContext对象获取应用部署上下文Context
XmlWebApplicationContext xwac = (XmlWebApplicationContext) ContextLoader.getCurrentWebApplicationCon ...
- python之旅七【第七篇】面向对象之类成员
面向对象的类成员 相关知识点 一 字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Provinc ...
- Python代码编写规范
Python代码编写规范 编码: a) 如无特殊情况,文件一律使用UTF-8编码 b) 如无需特殊情况,文件头部必须加入#-*-coding:utf-8-*- 缩进 a) 统一 ...
- 【刷题】BZOJ 2759 一个动态树好题
Description 有N个未知数x[1..n]和N个等式组成的同余方程组: x[i]=k[i]*x[p[i]]+b[i] mod 10007 其中,k[i],b[i],x[i]∈[0,10007) ...
- 自学华为IoT物联网_09 OceanConnect业务流程
点击返回自学华为IoT物流网 自学华为IoT物联网_09 OceanConnect业务流程 1. 物流网重要的连个协议介绍 1.1 重要物联网协议介绍----MQTT MQTT(消息队列遥测传输) ...
- luogu5022 [NOIp2018]旅行 (dfs)
m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) #include<cstdio& ...
- 【git】git撤销与回滚
git的撤销与回滚在平时使用中还是比较多的,比如说我们想将某个修改后的文件撤销到上一个版本,或者是想撤销某次多余的提交,都要用到git的撤销和回滚操作.撤销分两种情况,一个是commit之前,一个是c ...
- ArcGIS for qml -添加自由文本
源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 实现地图上鼠标点击后添加自由文本功能 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载 ...
- [FWT] UOJ #310. 【UNR #2】黎明前的巧克力
[uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...
- 斯坦福大学公开课机器学习:advice for applying machine learning | diagnosing bias vs. variance(机器学习:诊断偏差和方差问题)
当我们运行一个学习算法时,如果这个算法的表现不理想,那么有两种原因导致:要么偏差比较大.要么方差比较大.换句话说,要么是欠拟合.要么是过拟合.那么这两种情况,哪个和偏差有关.哪个和方差有关,或者是不是 ...