首页 > 其他分享 >割点

割点

时间:2024-04-09 16:23:41浏览次数:16  
标签:back int 割点 son dfn low

割点

割点是如果删除这个点, 连通块 + 1 的点就是割点。

可以发现,在 DFS 树上, 如果一个点的儿子不能通过一些非树边到达它的父亲, 如果把它删除, 这个儿子将会和他的父亲不连通。

#include<bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

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

struct Edge{
  int v, w;
};

vector<Edge>g[N];

vector<int>e;

void dfs(int x, int f){
  int son = 0, flag = 0;
  dfn[x] = low[x] = ++cnt;
  for(auto [v, w] : g[x]){
    if(!dfn[v]){
      dfs(v, x);
      low[x] = min(low[x], low[v]);
      son++;
      if(f && low[v] >= dfn[x] || !f && son > 1){
        flag = 1;
      }
    }
    else if(v != f){
      low[x] = min(low[x], dfn[v]);
    }
  }
  if(flag){
    e.push_back(x);
  }
}

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);
    }
  }
  cout << e.size() << '\n';
  sort(e.begin(), e.end());
  for(auto x : e){
    cout << x << ' ';
  }
  return 0;
}

细节 : 根节点只有有超过一个儿子就是割点。

标签:back,int,割点,son,dfn,low
From: https://www.cnblogs.com/liuyichen0401/p/18124233

相关文章

  • 图论割点模板
    #include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#include<map>#include<queue......
  • P3388 【模板】割点(割顶)
    原题链接题解先说结论对单个图做深度搜索树,对于树的根节点,它要能是割点当且仅当她有至少两个不互通的儿子节点对于树的非叶子非根节点,它要能是割点当且仅当存在儿子节点能去的时间戳最小的节点不小于当前节点的深度搜索序对于叶子节点,不可能成为割点code#include<bits/std......
  • 学习笔记——割点与桥
    一、割点、桥基本概念给定无向图\(G=(V,E)\)。对于一个点\(u\inG\),删除一个节点\(u\)与该节点所有相连的边后,该图不连通,则称点\(u\)为割点。对于一条边\(\{U,W\}\inG\),删除一条边\(\{U,W\}\)后,该图不连通,则称边\(\{U,W\}\)为桥。二、暴力算法对于割点,枚举每个......
  • tarjan无向图割点板子
    //无向图割点模板#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'#defineN20001usingnamespacestd;template<typenameTp>inlinevoidread(Tp&x){x=0;registerboolf=1;registercharc=getchar();for(;c&......
  • 【POJ 1144】Network 题解(Tarjan算法求无向图的割点)
    一家电话线公司(TLC)正在建立一个新的电话电缆网络。它们连接由1到N的整数编号的几个位置。没有两个地方的数字相同。这些线路是双向的,总是连接在两个地方,在每一个地方,线路都以电话交换机结束。每个地方都有一个电话交换机。从每个地方可以通过其他地方的线路到达,但不需要直接连接,可......
  • TARJAN复习 求强连通分量、割点、桥
    TARJAN复习求强连通分量、割点、桥目录TARJAN复习求强连通分量、割点、桥强连通分量缩点桥割点感觉之前写的不好,再水一篇博客强连通分量“有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(......
  • 割边+割点 学习心得
    先背诵tarjan板子#include<bits/stdc++.h>using namespace std;#define N 10005#define M 100005int tot,first[N],nxt[M],to[M];void add(int x,int y){    nxt[++tot]=first[x];    first[x]=tot;    to[tot]=y;}int n......
  • Tarjan 求割点和桥
    欢迎批评指正!前置芝士割点:对于一个点\(u\),若删除\(u\)会使当前无向图中连通分量增多,我们就称\(u\)为该图的割点。桥(割边):同理,对于一条边\((u,v)\),若删除\((u,v)\)会使当前无向图中连通分量增多,我们就称\((u,v)\)为该图的桥。Tarjan求强连通分量Tarjan求割点设......
  • 缩点+割点学习笔记
    缩点传送门根据题意:允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。所以我们可以考虑将可以相互到达的若干个点缩成一个点,以方便计算。下面讲如何实现:考虑\(dfs\),并且对点记录如下信息\(dfn\)(该点被遍历到的时间节点,即该点是第几个被遍历到的),\(low\)(可以追溯到......
  • 割点和割边
    \(x's\text{}son\inT(x)\)\(Isn't\text{}x's\text{}son\inT'(x)\)\(x\inCutpoint,y\inT(x),y\notinT'(x)\)。\(i's\text{dfsorder}\todfn_i\)$\min(dfn_{f_y,y\inT(x)})\tolow_x$\(low_{y......