首页 > 编程语言 >【算法】BFS、并查集和拓扑排序

【算法】BFS、并查集和拓扑排序

时间:2024-04-04 13:33:16浏览次数:23  
标签:int edge 拓扑 查集 find BFS vector 节点

最近刷到了两道关于图论很有意思的题目()。做法颇有相似之处,因此记录一下吧

AcWing2069. 网络分析

标签:dfs、并查集

题目描述

image
题目大意是,有一个\(n\)个顶点的网络,初始状态图中没有边。
有两种操作:操作1将节点\(a\)和节点\(b\)连接起来;操作2使节点\(p\)的值加\(t\),\(t\)值会沿着网络传送到每一个相邻的节点及其所有子节点。
最后要输出一系列操作后所有节点的值。
因此考虑使用并查集维护图中所有的联通块,便于维护每个块的规模和块的值。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110010;

int n, m;
int p[N], d[N];

int find(int x)
{
    if (p[x] != x)
    {
        if (p[p[x]] == p[x]) return p[x];
        int r = find(p[x]);
        d[x] += d[p[x]];
        p[x] = r;
    }
    return p[x];
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < N; i ++ ) p[i] = i;

    int k = n;
    while (m -- )
    {
        int t, a, b;
        scanf("%d%d%d", &t, &a, &b);
        if (t == 1)
        {
            a = find(a), b = find(b);
            if (a != b)
            {
                k ++ ;
                p[a] = p[b] = k;
            }
        }
        else
        {
            a = find(a);
            d[a] += b;
        }
    }

    for (int i = 1; i <= n; i ++ )
        if (i == find(i)) printf("%d ", d[i]);
        else printf("%d ", d[i] + d[find(i)]);

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/603227/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

LC2192. 有向无环图中一个节点的所有祖先

image

class Solution {
public:
    vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
        vector<unordered_set<int>> anc(n);//每个结点的祖先数组
        vector<vector<int>> e(n);//邻接表
        vector<int> indeg(n);//入度表
        //预处理邻接表和入度表
        for (const auto &edge: edges)
        {
            e[edge[0]].push_back(edge[1]);//[from, to]
            ++indeg[edge[1]];
        }
        //bfs实现拓扑排序
        queue<int> q;
        for (int i=0;i<n;i++)//每个顶点
        {
            if (!indeg[i]) q.push(i);
        }
        while (!q.empty())
        {
            int u=q.front();
            q.pop();
            for (int v:e[u])
            {
                anc[v].insert(u);
                for (int i:anc[u]) anc[v].insert(i);
                --indeg[v];
                if (!indeg[v]) q.push(v);
            }
        }
        vector<vector<int>> res(n);
        for (int i=0;i<n;i++)
        {
            for (int j:anc[i]) res[i].push_back(j);
            sort(res[i].begin(), res[i].end());
        }
        return res;
    }
};

第一题是并查集+树上搜索的结合体,第二题是BFS+图的基操+拓扑排序

标签:int,edge,拓扑,查集,find,BFS,vector,节点
From: https://www.cnblogs.com/liu-yc/p/18114120

相关文章

  • Luogu P8710 [蓝桥杯 2020 省 AB1] 网络分析 题解 [ 绿 ] [ 带权并查集 ]
    原题分析本题由于从一个节点发信息,同一个集合内的所有点都会收到信息,显然是一道要求维护各节点间关系的题,因此采用并查集的数据结构进行求解。但由于维护关系的同时还要维护权值,所以采用带权并查集,它是一种能维护某个节点与其祖宗节点之间关系的数据结构。带权并查集找父亲的......
  • 拓扑变化-导致MAC地址表错误
    本文章属个人学习整理的对应笔记,学习内容来自华为官方PPT和B站视频,学习视频链接如下,如有需要可自行观看【华为数通路由交换HCNA/HCIA(完)】https://www.bilibili.com/video/BV1Dg4y187bZ?p=44&vd_source=08192e8d3b82bf20dfe6807a2901dd9e整理内容不易,学习的朋友麻烦关注下......
  • 并查集(小白)
    许久未更新今天小小的学习一下 让我开始我们的学习之旅 并查集引入首先我们引入一个概念,并查集是管理元素所属集合的数据结构,可以理解为一个集合一棵树---这一颗树的每个节点都是一个元素。比如图中的元素1,2,3,4,5属于一个集合,元素6,7,8属于一个集合并查......
  • 算法题:经商(并查集+01背包)
    链接:经商来源:牛客网题目描述小d是一个搞房地产的土豪。每个人经商都有每个人经商的手段,当然人际关系是需要放在首位的。小d每一个月都需要列出来一个人际关系表,表示他们搞房地产的人的一个人际关系网,但是他的精力有限,对应他只能和能够接触到的人交际。比如1认识2,2认识3,那......
  • leetcode128. 最长连续序列【三种方法; 并查集; hashtable】
    文章目录1O(nlo......
  • 蓝桥杯T5合根植物——并查集模板题
    5.合根植物-蓝桥云课(lanqiao.cn) #include<bits/stdc++.h>usingnamespacestd;intm,n,pre[1000000];set<int>s;intfind(intx){if(pre[x]==x)returnx;returnfind(pre[x]);}intmain(){//请在此输入您的代码cin>>m>>......
  • Offer必备算法20_队列_宽搜bfs_四道力扣题详解(由易到难)
    目录①力扣429.N叉树的层序遍历解析代码②力扣103.二叉树的锯齿形层序遍历解析代码③力扣662.二叉树最大宽度解析代码④力扣515.在每个树行中找最大值解析代码本篇完。①力扣429.N叉树的层序遍历429.N叉树的层序遍历难度中等给定一个N叉树,返回其节......
  • 回家的路(BFS)
     题目描述直线上依次有1~n号位置,相邻位置距离为1,部分位置上有百合花,只有这些位置青蛙可以站上去。一只青蛙在1号位置,而它的家在n号位置,他每次可以跳两步或者三步。你要计算青蛙至少跳几次可以到家。【输入格式】输入共2行:第1行,一个整数n,意义如题目描述;第2......
  • 搜索与图论(五)拓扑排序---以题为例
    给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序......
  • 拓扑排序的模板
    拓扑排序的模板,csdn:https://blog.csdn.net/weixin_43872728/article/details/98981923#include<iostream>#include<vector>#include<cstdio>#include<queue>#include<cstring>#include<algorithm>usingnamespacestd;intin[10......