首页 > 其他分享 >图论

图论

时间:2024-07-10 13:19:29浏览次数:15  
标签:图论 int ++ dfn low vertot define

点双连通分量

#include <bits/stdc++.h>
#define sz(a) int((a).size())
#define FOR(i, l, r) for(int i = l; i <= r; i++)
#define ROF(i, r, l) for(int i = r; i >= l; i--)
#define ll long long
#define x first
#define y second
#define pi pair<int, int>
using namespace std;
const int N = 5e5 + 10;
int n, m;
vector<int> g[N];
int dfn[N], low[N], dfncnt = 0, stk[N], top = 0;
int ver[N * 2], vertot = 0, fir[N], firtot = 0;
void tarjan(int u) {
    dfn[u] = low[u] = ++dfncnt;
    stk[++top] = u;
    for(auto v : g[u]) {
        if(!dfn[v]) {
            tarjan(v);
            low[u] = min(low[u], low[v]);
            if(low[v] >= dfn[u]) {
                fir[++firtot] = vertot;
                for(int x = -1; x != v; ) {
                    x = stk[top--];
                    ver[++vertot] = x;
                }
                ver[++vertot] = u;
            }
        } else low[u] = min(low[u], dfn[v]);
    }
}
int main() {
    cin >> n >> m;
    FOR(i, 1, m) {
        int u, v;
        cin >> u >> v;
        g[u].emplace_back(v);
        g[v].emplace_back(u);
    }
    FOR(u, 1, n) {
        int preid = vertot;
        if(!dfn[u]) {
            tarjan(u);
            top--;
            if(preid == vertot) {
                fir[++firtot] = vertot;
                ver[++vertot] = u;
            }
        }
    }
    cout << firtot << "\n";
    fir[++firtot] = vertot;
    FOR(i, 1, firtot - 1) {
        cout << fir[i + 1] - fir[i] <<" ";
        for(int j = fir[i] + 1; j <= fir[i + 1]; j++) cout << ver[j] <<" ";
        cout << "\n";
    }
    return 0;
}

边双连通分量

#include <bits/stdc++.h>
#define sz(a) int((a).size())
#define FOR(i, l, r) for(int i = l; i <= r; i++)
#define ROF(i, r, l) for(int i = r; i >= l; i--)
#define ll long long
#define x first
#define y second
#define pi pair<int, int>
using namespace std;
const int N = 5e5 + 10, M = 2e6 + 10;
struct Edge {
    int to, nxt, vis;
}e[M << 1];
int head[N], etot = 1;
int n, m;
int dfn[N], low[N], dfncnt = 0, stk[N], top = 0;
int idtot = 0;
vector<int> id[N];
void adde(int u, int v) {
    e[++etot] = Edge{v, head[u], 0}, head[u] = etot;
}
void tarjan(int u, int fa) {
    dfn[u] = low[u] = ++dfncnt;
    stk[++top] = u;
    for(int i = head[u]; i; i = e[i].nxt) {
        if(e[i].vis) continue;
        int v = e[i].to;
        e[i].vis = e[i ^ 1].vis = 1;
        if(!dfn[v]) {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
        } else low[u] = min(low[u], dfn[v]);
    }
    if(dfn[u] == low[u]) {
        idtot++;
        for(int x = -1; x != u; ) {
            x = stk[top--];
            id[idtot].emplace_back(x);
        }
    }
    return;
}
int main() {
    cin >> n >> m;
    FOR(i, 1, m) {
        int u, v;
        cin >> u >> v;
        adde(u, v), adde(v, u);
    }
    FOR(u, 1, n) if(!dfn[u]) tarjan(u, 0);
    cout << idtot << "\n";
    FOR(i, 1, idtot) {
        cout << sz(id[i]) <<" ";
        for(auto x : id[i]) cout << x <<" ";
        cout << "\n"; 
    }
    return 0;
}

标签:图论,int,++,dfn,low,vertot,define
From: https://www.cnblogs.com/SegmentTree/p/18293873

相关文章

  • 代码随想录算法训练营第56天 | 图论理论基础 、深搜理论基础、98. 所有可达路径、广
    图论理论基础今天主要是理论大家可以在看图论理论基础的时候,很多内容看不懂,例如也不知道看完之后还是不知道邻接矩阵,邻接表怎么用,别着急。理论基础大家先对各个概念有个印象就好,后面在刷题的过程中,每个知识点都会得到巩固。https://www.programmercarl.com/kamacoder/图......
  • Python算法模版:图论中的最小生成树算法
        最小生成树具有什么特性,相信学过相关知识的同学知道(没学过的可以自己了解一下),就是说最小生成树的边权值之和最小,相对应的其最大边权也是最小的,适合解决n个城市,m条边,然后叫你求最小划分路径是什么样的。Kruskal算法模版    首先,肯定要对题目所给的数据进......
  • 图论总结
    重链剖分树上修改,查询路径信息之类的最多经过logn个轻边,这样可以更好地划分注意点:修改边权可以转化到点权上面:注意lca的位置不要修改,应该是update(id[y]+1,id[x])例题:轻重边:https://www.luogu.com.cn/problem/P7735判断是不是重边,信息转化到点上面,边两端的颜色相同就......
  • 图论(1)
    图论(一)图的存储与遍历方法一:直接存边方法二:邻接矩阵用bool类型二维数组存储\(u是否能到v\)方法三:邻接表以P5318为例。#include<bits/stdc++.h>#defineLLlonglong#definels(p<<1)#definers(p<<1|1)#defineINFINT_MAX#definelowbit(x)(x&-x)#define......
  • 图论最短路径问题与matlab实现
    上一次我们讨论了如何进行图论可视化,这一次我们通过matlab来找出图论中距离最小路径目录一、迪杰斯特拉算法(Dijkstra)二、shortestpath函数用法1.基本语法2.参数设计3.应用实例(1)输入图论信息(2)输入参数进行求解(3)最短路径可视化三、distances函数————求出任意两点的最短路径矩......
  • 图论初步与可视化
    本讲将简要介绍图论中的基本概念,并主要讲解图论中的最短路径问题。以及如何将图论可视化目录一、图论的概念二、在线作图网站1.index介绍2.NodeCount介绍3.Graphdata三、Matlab作无向图1.无权图(每条边的权重默认为1)2.利用字符串做无权图3.有权图四、Matlab作有向图一、图论的......
  • 【数据结构与算法】图论 详解
    何为完全图、稀疏图、稠密图。完全图:完全图是一种简单的无向图,其中每对不同的顶点之间都恰好有一条边。对于有n个顶点的完全图,它包含n(n-1)/2条边。在有向图中,如果任意两个顶点之间都存在方向相反的两条边,包含n(n-1)条边,则该图被称为有向完全图。稀疏图:稀疏图是边数相......
  • 【广度优先搜索 深度优先搜索 图论】854. 相似度为 K 的字符串
    本文涉及知识点广度优先搜索深度优先搜索图论图论知识汇总深度优先搜索汇总C++BFS算法LeetCode854.相似度为K的字符串对于某些非负整数k,如果交换s1中两个字母的位置恰好k次,能够使结果字符串等于s2,则认为字符串s1和s2的相似度为k。给你两个字母......
  • [学习笔记] 树链剖分 - 图论 & 数据结构
    树链剖分怎么说呢,感觉只要不是求最大最小值好像都可以用树上查分代替。例题[ZJOI2008]树的统计-单点修改树链查询树链剖分板子,不多说了,代码注意细节就行。该用dfn的地方不要把点的编号传进去。#include<bits/stdc++.h>usingnamespacestd;#definels(id<<1)#define......
  • 大厂面试高频题目——图论
    797.所有可能的路径给你一个有n个节点的有向无环图(DAG),请你找出所有从节点0到节点n-1的路径并输出(不要求按特定顺序)graph[i]是一个从节点i可以访问的所有节点的列表(即从节点i到节点graph[i][j]存在一条有向边)。思考深搜dfs模板题。classSolution:def__in......