// 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缩点模板相关推荐

  1. Tarjan算法 —— 强连通双连通缩点 模板

    TP 强连通缩点模板 双连通缩点模板 边双连通 点双连通 有向图 我们知道在一张 有向无环 图(也叫 DAG)中,肯定存在拓扑序.拓扑序的特殊顺序性质,能够允许我们在 O(n+m)O(n + m)O( ...

  2. 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会

    先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...

  3. POJ 3177 Redundant Paths (边双连通+缩点)

    <题目链接> <转载于 >>>  > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...

  4. 模板:割点、桥与双连通

    文章目录 割点 代码 桥 点双连通分量 代码 边双连通分量 代码 割点 和强连通分量十分相似 分为树枝边.前向边和后向边 注意! if(x!=r&&low[to]>=dfn[x] ...

  5. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  6. 图论复习之强连通分量以及缩点—Tarjan算法

    图论复习之强连通分量以及缩点-Tarjan算法                                 by RtPYH ----------------------------------- ...

  7. HDU 4338 Simple Path 点双连通+lca

    [题目大意] 给你一个无向图.问,从点u到点v,若是只走简单路径,有多少个点不能到达? [思路] 这题肯定是要双连通缩点的,以前老是觉得点双连通不会用来缩点,因为割点可以属于多个连通集合,现在立马打脸 ...

  8. 图的连通性相关总结:强连通,双连通,割点割边,2-sat

    刚学完了连通性相关的知识,总结一下 以下均使用tarjan算法 强联通分量 定义 强连通分量即强联通子图,一般我们都在有向图中求取最大强连通分量,即有向图一张图中任两点可达的最大子图.其中单独一个点也 ...

  9. 边双连通和点双连通(连通性)

    一.时间戳: 1.一种记录时间的方式,像DFS序 2.防伪,不重复,精确到时刻 3.对每个节点而言,时间戳一般用dfn[i]来表示,最小时间戳一般用low[i]来表示 二.一些边: 1.前向边:当前点 ...

最新文章

  1. 实现PHP基本安全的11条准则
  2. HTTP缓存原理介绍
  3. autojs微博_js实现微博发布小功能
  4. P1616 疯狂的采药(python3实现)--80分
  5. String/StringBuffer/StringBuilder的执行效率以及区别
  6. Go语言入门编程学习结束
  7. webService返回自定义类型的数据处理
  8. 使用OGR创建弧形图形
  9. xpath的基础知识
  10. MATLAB 2016a安装
  11. 5款Java微服务开源框架
  12. 上交所、深交所证券代码编码规则
  13. zip保存数据和接口获取压缩包 jsZip
  14. 荣誉背后的故事:达内到底有多强?
  15. vue 开发App监听手机 返回键返回上级路由以及退出
  16. “荣耀10X”更名背后的现实逻辑与未来风暴
  17. 比数据可视化更高级的大屏可视化
  18. Unity 使用谷歌内购的密钥( license key )
  19. 数据库常用操作,会持续更新
  20. 重磅消息!微信电脑版本,终于支持刷朋友圈啦!附内测下载地址!

热门文章

  1. 有效使用计算机操作系统,有效地使用计算机操作系统.doc
  2. Android系统自带样式(android:theme)
  3. 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题
  4. php ftp rmdir,PHP中的ftp_rmdir()函数
  5. 《软技能——代码之外的生存指南》 之博客篇
  6. JavaScript DOM 6 - 节点的创建,插入,替换,删除
  7. RSS 没有死亡 而是无所不在
  8. 读《大学之路》有感①
  9. Redis之java操作篇(数据对象的存取)
  10. CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况