图论--边双连通V-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], 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缩点相关推荐
- 图论与java_算法笔记_150:图论之双连通及桥的应用(Java)
1 问题描述 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which a ...
- Tarjan算法 —— 强连通双连通缩点 模板
TP 强连通缩点模板 双连通缩点模板 边双连通 点双连通 有向图 我们知道在一张 有向无环 图(也叫 DAG)中,肯定存在拓扑序.拓扑序的特殊顺序性质,能够允许我们在 O(n+m)O(n + m)O( ...
- POJ 3177 Redundant Paths (边双连通+缩点)
<题目链接> <转载于 >>> > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...
- 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- HDU 4338 Simple Path 点双连通+lca
[题目大意] 给你一个无向图.问,从点u到点v,若是只走简单路径,有多少个点不能到达? [思路] 这题肯定是要双连通缩点的,以前老是觉得点双连通不会用来缩点,因为割点可以属于多个连通集合,现在立马打脸 ...
- 图的连通性相关总结:强连通,双连通,割点割边,2-sat
刚学完了连通性相关的知识,总结一下 以下均使用tarjan算法 强联通分量 定义 强连通分量即强联通子图,一般我们都在有向图中求取最大强连通分量,即有向图一张图中任两点可达的最大子图.其中单独一个点也 ...
- POJ-3352-RoadConstruction(边双联通分量,缩点)
链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...
- 模板:割点、桥与双连通
文章目录 割点 代码 桥 点双连通分量 代码 边双连通分量 代码 割点 和强连通分量十分相似 分为树枝边.前向边和后向边 注意! if(x!=r&&low[to]>=dfn[x] ...
最新文章
- 【每日DP】day7P1064 金明的预算方案 (分组背包,我又悟了)难度⭐⭐★
- mysql系列十、mysql索引结构的实现B+树/B-树原理
- 获取和设置mfc中Edit输入的文字
- 大数据图数据库之数据分片
- 硬核妹子的创意设计:舌头控制器
- python 3.9.0a0_Python 3.9.0 稳定版发布
- Jack Dorsey二度卸任推特CEO,原CTO接棒,立即生效!
- Python——五分钟理解函数式编程与闭包
- ACM-Maximum Tape Utilization Ratio
- 计算机数学基础知识点归纳,《计算机数学基础》(一)――离散数学期末复习参考...
- pb 导出文件 日期格式_「案例分享」ERP系统导出数据注意事项
- 理解主从设备模式(Master-Slave)
- 2022高教社杯全国大学生数学建模竞赛B题解析(更新完结)
- MATLAB【函数求导与积分】
- C库-atoi(), atol(), atoll(), atof(), ceil(), ceilf(), ceill()
- unity 世界坐标间角度_Unity 世界坐标局部坐标下的旋转
- 网络安全学习路线是怎样的?
- 中国176个AAAAA级景区,存起来吧!下一站你去哪里?
- android webview html 字体大小,Android webview设置字体大小,适配屏幕,夜间模式
- 2008欧锦赛 球员名单 C组
热门文章
- git开发之查看修改账户邮箱命令
- Android Studio百度地图开发所需参数获取SHA1或MD5的最简单方法(图文教程)
- 夏普出了款机器人手机 可以和你“坐着聊聊天”
- MySQL数据库权限管理
- HFun.快速开发平台(一)=》简述
- 字符串分割 函数实现
- git忽略文件【转】
- [leetcode]Median of Two Sorted Arrays @ Python
- apache rewrite 二级域名
- java 解析日期 t z_date - Java SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ss'Z'”)给出时区为IST...