图论--双连通E-DCC缩点模板
// tarjan算法求无向图的桥、边双连通分量并缩点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int SIZE = 100010;
int head[SIZE], ver[SIZE * 2], Next[SIZE * 2];
int dfn[SIZE], low[SIZE], c[SIZE];
int n, m, tot, num, dcc, tc;
bool bridge[SIZE * 2];
int hc[SIZE], vc[SIZE * 2], nc[SIZE * 2];void add(int x, int y) {ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}void add_c(int x, int y) {vc[++tc] = y, nc[tc] = hc[x], hc[x] = tc;
}void tarjan(int x, int in_edge) {dfn[x] = low[x] = ++num;for (int i = head[x]; i; i = Next[i]) {int y = ver[i];if (!dfn[y]) {tarjan(y, i);low[x] = min(low[x], low[y]);if (low[y] > dfn[x])bridge[i] = bridge[i ^ 1] = true;}else if (i != (in_edge ^ 1))low[x] = min(low[x], dfn[y]);}
}void dfs(int x) {c[x] = dcc;for (int i = head[x]; i; i = Next[i]) {int y = ver[i];if (c[y] || bridge[i]) continue;dfs(y);}
}int main() {cin >> n >> m;tot = 1;for (int i = 1; i <= m; i++) {int x, y;scanf("%d%d", &x, &y);add(x, y), add(y, x);}for (int i = 1; i <= n; i++)if (!dfn[i]) tarjan(i, 0);for (int i = 2; i < tot; i += 2)if (bridge[i])printf("%d %d\n", ver[i ^ 1], ver[i]);for (int i = 1; i <= n; i++)if (!c[i]) {++dcc;dfs(i);}printf("There are %d e-DCCs.\n", dcc);for (int i = 1; i <= n; i++)printf("%d belongs to DCC %d.\n", i, c[i]);tc = 1;for (int i = 2; i <= tot; i++) {int x = ver[i ^ 1], y = ver[i];if (c[x] == c[y]) continue;add_c(c[x], c[y]);}printf("缩点之后的森林,点数 %d,边数 %d\n", dcc, tc / 2);for (int i = 2; i < tc; i += 2)printf("%d %d\n", vc[i ^ 1], vc[i]);
}
图论--双连通E-DCC缩点模板相关推荐
- Tarjan算法 —— 强连通双连通缩点 模板
TP 强连通缩点模板 双连通缩点模板 边双连通 点双连通 有向图 我们知道在一张 有向无环 图(也叫 DAG)中,肯定存在拓扑序.拓扑序的特殊顺序性质,能够允许我们在 O(n+m)O(n + m)O( ...
- 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...
- POJ 3177 Redundant Paths (边双连通+缩点)
<题目链接> <转载于 >>> > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...
- 模板:割点、桥与双连通
文章目录 割点 代码 桥 点双连通分量 代码 边双连通分量 代码 割点 和强连通分量十分相似 分为树枝边.前向边和后向边 注意! if(x!=r&&low[to]>=dfn[x] ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- 图论复习之强连通分量以及缩点—Tarjan算法
图论复习之强连通分量以及缩点-Tarjan算法 by RtPYH ----------------------------------- ...
- HDU 4338 Simple Path 点双连通+lca
[题目大意] 给你一个无向图.问,从点u到点v,若是只走简单路径,有多少个点不能到达? [思路] 这题肯定是要双连通缩点的,以前老是觉得点双连通不会用来缩点,因为割点可以属于多个连通集合,现在立马打脸 ...
- 图的连通性相关总结:强连通,双连通,割点割边,2-sat
刚学完了连通性相关的知识,总结一下 以下均使用tarjan算法 强联通分量 定义 强连通分量即强联通子图,一般我们都在有向图中求取最大强连通分量,即有向图一张图中任两点可达的最大子图.其中单独一个点也 ...
- 边双连通和点双连通(连通性)
一.时间戳: 1.一种记录时间的方式,像DFS序 2.防伪,不重复,精确到时刻 3.对每个节点而言,时间戳一般用dfn[i]来表示,最小时间戳一般用low[i]来表示 二.一些边: 1.前向边:当前点 ...
最新文章
- 实现PHP基本安全的11条准则
- HTTP缓存原理介绍
- autojs微博_js实现微博发布小功能
- P1616 疯狂的采药(python3实现)--80分
- String/StringBuffer/StringBuilder的执行效率以及区别
- Go语言入门编程学习结束
- webService返回自定义类型的数据处理
- 使用OGR创建弧形图形
- xpath的基础知识
- MATLAB 2016a安装
- 5款Java微服务开源框架
- 上交所、深交所证券代码编码规则
- zip保存数据和接口获取压缩包 jsZip
- 荣誉背后的故事:达内到底有多强?
- vue 开发App监听手机 返回键返回上级路由以及退出
- “荣耀10X”更名背后的现实逻辑与未来风暴
- 比数据可视化更高级的大屏可视化
- Unity 使用谷歌内购的密钥( license key )
- 数据库常用操作,会持续更新
- 重磅消息!微信电脑版本,终于支持刷朋友圈啦!附内测下载地址!
热门文章
- 有效使用计算机操作系统,有效地使用计算机操作系统.doc
- Android系统自带样式(android:theme)
- 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题
- php ftp rmdir,PHP中的ftp_rmdir()函数
- 《软技能——代码之外的生存指南》 之博客篇
- JavaScript DOM 6 - 节点的创建,插入,替换,删除
- RSS 没有死亡 而是无所不在
- 读《大学之路》有感①
- Redis之java操作篇(数据对象的存取)
- CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况