// 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], stack[SIZE], new_id[SIZE], c[SIZE];
int n, m, tot, num, root, top, cnt, tc;
bool cut[SIZE];
vector<int> dcc[SIZE];
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) {dfn[x] = low[x] = ++num;stack[++top] = x;if (x == root && head[x] == 0) { // 孤立点dcc[++cnt].push_back(x);return;}int flag = 0;for (int i = head[x]; i; i = Next[i]) {int y = ver[i];if (!dfn[y]) {tarjan(y);low[x] = min(low[x], low[y]);if (low[y] >= dfn[x]) {flag++;if (x != root || flag > 1) cut[x] = true;cnt++;int z;do {z = stack[top--];dcc[cnt].push_back(z);} while (z != y);dcc[cnt].push_back(x);}}else low[x] = min(low[x], dfn[y]);}
}int main() {cin >> n >> m;tot = 1;for (int i = 1; i <= m; i++) {int x, y;scanf("%d%d", &x, &y);if (x == y) continue;add(x, y), add(y, x);}for (int i = 1; i <= n; i++)if (!dfn[i]) root = i, tarjan(i);for (int i = 1; i <= n; i++)if (cut[i]) printf("%d ", i);puts("are cut-vertexes");for (int i = 1; i <= cnt; i++) {printf("v-DCC #%d:", i);for (int j = 0; j < dcc[i].size(); j++)printf(" %d", dcc[i][j]);puts("");}// 给每个割点一个新的编号(编号从cnt+1开始)num = cnt;for (int i = 1; i <= n; i++)if (cut[i]) new_id[i] = ++num;// 建新图,从每个v-DCC到它包含的所有割点连边tc = 1;for (int i = 1; i <= cnt; i++)for (int j = 0; j < dcc[i].size(); j++) {int x = dcc[i][j];if (cut[x]) {add_c(i, new_id[x]);add_c(new_id[x], i);}else c[x] = i; // 除割点外,其它点仅属于1个v-DCC}printf("缩点之后的森林,点数 %d,边数 %d\n", num, tc / 2);printf("编号 1~%d 的为原图的v-DCC,编号 >%d 的为原图割点\n", cnt, cnt);for (int i = 2; i < tc; i += 2)printf("%d %d\n", vc[i ^ 1], vc[i]);
}

图论--边双连通V-DCC缩点相关推荐

  1. 图论与java_算法笔记_150:图论之双连通及桥的应用(Java)

    1 问题描述 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which a ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

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

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

最新文章

  1. 【每日DP】day7P1064 金明的预算方案 (分组背包,我又悟了)难度⭐⭐★
  2. mysql系列十、mysql索引结构的实现B+树/B-树原理
  3. 获取和设置mfc中Edit输入的文字
  4. 大数据图数据库之数据分片
  5. 硬核妹子的创意设计:舌头控制器
  6. python 3.9.0a0_Python 3.9.0 稳定版发布
  7. Jack Dorsey二度卸任推特CEO,原CTO接棒,立即生效!
  8. Python——五分钟理解函数式编程与闭包
  9. ACM-Maximum Tape Utilization Ratio
  10. 计算机数学基础知识点归纳,《计算机数学基础》(一)――离散数学期末复习参考...
  11. pb 导出文件 日期格式_「案例分享」ERP系统导出数据注意事项
  12. 理解主从设备模式(Master-Slave)
  13. 2022高教社杯全国大学生数学建模竞赛B题解析(更新完结)
  14. MATLAB【函数求导与积分】
  15. C库-atoi(), atol(), atoll(), atof(), ceil(), ceilf(), ceill()
  16. unity 世界坐标间角度_Unity 世界坐标局部坐标下的旋转
  17. 网络安全学习路线是怎样的?
  18. 中国176个AAAAA级景区,存起来吧!下一站你去哪里?
  19. android webview html 字体大小,Android webview设置字体大小,适配屏幕,夜间模式
  20. 2008欧锦赛 球员名单 C组

热门文章

  1. git开发之查看修改账户邮箱命令
  2. Android Studio百度地图开发所需参数获取SHA1或MD5的最简单方法(图文教程)
  3. 夏普出了款机器人手机 可以和你“坐着聊聊天”
  4. MySQL数据库权限管理
  5. HFun.快速开发平台(一)=》简述
  6. 字符串分割 函数实现
  7. git忽略文件【转】
  8. [leetcode]Median of Two Sorted Arrays @ Python
  9. apache rewrite 二级域名
  10. java 解析日期 t z_date - Java SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ss'Z'”)给出时区为IST...