首页 > 其他分享 >边双连通分量

边双连通分量

时间:2024-04-09 16:15:21浏览次数:16  
标签:连通 cn 边双 int dfn low 分量

边双连通分量

我们令双连通表示两个节点之间段开一条边还是连通的。

边双连通分量 表示求出几个最大的点集, 使得任意一个点集中点两两双连通。

例题 luoguP8436

方法1

我们发现, 如果两个节点原先连通但不是双连通, 肯定他们之间的路径是经过某一座桥, 所以可以求出来桥, 把桥拆掉, 再求连通块。

#include<bits/stdc++.h>

using namespace std;

const int N = 2e6 + 5;

struct Edge{
  int v, w;
};

int tot, cnt, cn[N], dfn[N], low[N], vis[N], n, m, u, v;

vector<Edge>g[N];

vector<int>e[N];

void dfs(int x, int f){
  dfn[x] = low[x] = ++cnt;
  for(auto [v, w] : g[x]){
    if(!dfn[v]){
      dfs(v, w);
      low[x] = min(low[x], low[v]);
    }
    else if(w != f){
      low[x] = min(low[x], dfn[v]);
    }
  }
  if(low[x] == dfn[x]){
    vis[f] = 1;
  }
}

void DFS(int x){
  if(cn[x]){
    return;
  }
  cn[x] = 1;
  e[tot].push_back(x);
  for(auto [v, w] : g[x]){
    if(!vis[w]){
      DFS(v);
    }
  }
}

int main(){
  cin >> n >> m;
  for(int i = 1; i <= m; ++i){
    cin >> u >> v;
    g[u].push_back({v, i});
    g[v].push_back({u, i});
  }
  for(int i = 1; i <= n; ++i){
    if(!dfn[i]){
      dfs(i, 0);
    }
  }
  for(int i = 1; i <= n; ++i){
    if(!cn[i]){
      ++tot;
      DFS(i);
    }
  }
  cout << tot << '\n';
  for(int i = 1; i <= tot; ++i){
    cout << e[i].size() << ' ';
    for(auto x : e[i]){
      cout << x << ' ';
    }
    cout << '\n';
  }
  return 0;
}

方法2

未完工 \(\cdots\)

标签:连通,cn,边双,int,dfn,low,分量
From: https://www.cnblogs.com/liuyichen0401/p/18124179

相关文章

  • 聚水潭与金蝶云星空对接集成退货退款查询连通[聚水潭][销售退货单标准新增]-v1(聚水潭
    聚水潭与金蝶云星空对接集成退货退款查询连通[聚水潭][销售退货单标准新增]-v1(聚水潭--销售退货对接-P-12495392-这个店铺的数据)接入系统:聚水潭聚水潭是SaaS协同平台、电商ERP软件。聚水潭成立于2014年,创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。......
  • [转]Docker 两个不同网络间实现连通
    原文地址:Docker两个不同网络间实现连通-西瓜君~-博客园一、启动不同网络的容器1、启动两个bridge(自带默认)桥接的容器[root@yang~]#dockerrun-it--nametomcat1tomcat[root@yang~]#dockerrun-it--nametomcat2tomcat#查看容器[root@yang~]#dockerps......
  • Python环境下一种改进小波分解方法-用于多分量信号的分解
    小波通俗的讲就是一种振幅表现为在正负之间震荡的波形。小波变换在基于短时傅立叶变换的前提下,又加入了其所没有的可随频率变化的“时间-频率”窗口,其能对时间、频率进行局部化分析,并且对待处理信号通过多尺度处理使其表现为时-频细分的特点,是一种能突出信号时频特点以及细节的......
  • 强连通分量随记随忘
    vis用于判断某个点是否在栈中tot表示强连通分量的数量belong[x]表示点x所属的强连通分量all[]与tot变量相关,表示此强连通分量的点的数量outd[]与tot变量相关,表示此强连通分量的出度模板代码如下:#include<bits/stdc++.h>usingnamespacestd;constintN=1e4+5;intn,m,......
  • 太阳之华 连通块计数
    C-太阳之华_牛客小白月赛89(nowcoder.com)思路:可以发现,最多经过一次操作就能知道结果:全是蓝色:蓝方胜全是红色:红方胜红方经过一次操作:存在一个连通块扩散等于蓝色个数:红方胜否则,红蓝一直重复进行,平局因此,对棋盘进行一次遍历,将所有红色连通块全部找出来并记上标记(类......
  • DFS求解连通块问题
    DFS求解连通块问题#include<bits/stdc++.h>usingnamespacestd;charg[35][65];intvis[35][65],num,res;intdx[]={0,1,0,-1},dy[]={1,0,-1,0};voiddfs(intx,inty){if(x<1||x>30||y<1||y>60||g[x][y]=='0'||vis[x][y])return;vis[x][......
  • 7-5 列出连通集
    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个......
  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • redis查询端口与密码以及连通性测试方法
    目录一.端口查找二.密码查找三.连通性测试前言:redis的配置信息都在redis.conf文件里面,可以通过find/-nameredis.conf 进行查找文件存放位置,然后进入redis.conf文件进行查看一.端口查找1.使用命令 ps-ef|grepredis进行查找,示例6450/6451均为redis......
  • 有向图的连通性
    强连通:如果两个点彼此都能到达对方,那么这两个点是连通的。如果一个图中任意两个点都连通,那么这个图是强连通图。强连通分量:如果一个图不是强连通图,那么可以将其分为多个子图,使得每个子图强连通且不能与其他的子图形成强连通,那么每个子图就是强连通分量。简单点说,如果将所有子图缩......