算法提高课第三章拓扑排序

news/2024/7/15 18:04:09 标签: 动态规划, 算法, 图论

164. 可达性统计 - AcWing题库

  1. 求解拓扑序
  2. 按照拓扑序求解状态(状态定义为bitset<N>)
    AcWing 164. 可达性统计(2种简单写法) - AcWing
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bitset>
#include <queue>
using namespace std;
const int N = 30010;
const int M = N;
int n, m;
int h[N], e[M], ne[M], idx;
bitset<N> f[N];
int le[N], cnt = 0, ind[N];
void add(int a, int b)  // 添加一条边a->b
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m;
    for(int i = 1; i <= m; i ++ )
    {
        int a, b;
        cin >> a >> b;//a--->b
        add(a, b);
        ind[b] ++;
    }
    queue<int> q;
    for(int i = 1; i <= n; i ++ )
        if(!ind[i]) q.push(i);
    while(q.size())
    {
        int u = q.front();
        q.pop();
        le[++ cnt] = u;
        for(int i = h[u]; ~i; i = ne[i])
        {
            int j = e[i];
            ind[j] --;
            if(!ind[j]) q.push(j);
        }
    }
    for(int i = cnt; i >= 1; i -- )
    {
        int u = le[i];
        f[u][u] = 1;//自己可达
        for(int i = h[u]; ~i; i = ne[i])
        {
            int j = e[i];// u--->j
            f[u] |= f[j];
        }
    }
    for(int i = 1; i <= n; i ++) cout << f[i].count() << endl;
}

456. 车站分级 - AcWing题库

虚拟源点的应用
AcWing 456. 车站分级 - AcWing

//不停靠说明 a < b
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int N = 3100;
const int M = 5000100;
int n, m;
int ind[N], dist[N], a[N];
int h[N], e[M], ne[M], idx, w[M];
int cnt1, cnt2;
bool g[N][N];
bool vis[N];
void add(int a, int b, int c)  // 添加一条边a->b
{
    w[idx] = c, e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

int main()
{
    ios::sync_with_stdio(false);
    memset(h, -1, sizeof h);
    cin >> n >> m;
    for(int i = 1; i <= m; i ++ )
    {
        cin >> cnt1;
        memset(vis, 0, sizeof vis);
        cnt2 = 0 ;
        for(int j = 1; j <= cnt1; j ++ )
        {
            cin >> a[j];
            vis[a[j]] = true;
        }
        // j --- > n + 1 ---- > k
        for(int j = a[1]; j <= a[cnt1]; j ++ )
        {
            if(vis[j]) add(n + i, j, 1), ind[j] ++;
            else add(j, n + i, 0), ind[n + i] ++;
        }
    }
    
    queue<int> q;
    for(int i = 1; i <= n; i ++ ) dist[i] = 1;
    for(int i = 1; i <= n + m; i ++ )
    {
        if(!ind[i]) 
        {
            q.push(i);
        }
    }
    while(q.size())
    {
        int u = q.front();
        q.pop();
        for(int i = h[u]; ~i; i = ne[i])
        {
            int j = e[i];
            dist[j] = max(dist[j], dist[u] + w[i]);
            ind[j] --;
            if(!ind[j]) q.push(j);
        }
    }
    int ans = 0;
    for(int i = 1; i <= n; i ++ ) ans = max(ans, dist[i]);
    cout << ans;
}

http://www.niftyadmin.cn/n/864681.html

相关文章

算法提高课第一章状态机模型

划定每一个状态 分析状态转移方程 1049. 大盗阿福 - AcWing题库 #include <iostream> #include <cstring> #include <algorithm>using namespace std; const int N 110000; int a[N]; int dp[N][2]; int n; int main() {int t;cin >> t;while(t --){…

SRv6网络编程阅读笔记

SRv6基本原理 概述 网络指令&#xff1a;SRv6 Segment&#xff08;SID&#xff09; LocatorFunctionArgumentsLocator是网络拓扑中分配给一个网络节点的标识&#xff0c;用于路由和转发报文到该节点。Locator标识位置信息&#xff0c;它有两个重要的属性&#xff1a;可路由和…

Acwing基础课刷题

第一讲 基础算法 快速排序88 (AcWing) (785). 快速排序 (AcWing) (786). 第(k)个数 归并排序 (AcWing) (787). 归并排序 (AcWing) (788). 逆序对的数量 二分 (AcWing) (789). 数的范围 (AcWing) (790). 数的三次方根 高精度 (AcWing) (791). 高精度加法 (AcWing) (…

力扣刷题指南

链表 计算表达式 二叉树 树的搜索 双指针 动态规划

LeetCode——计算表达式

224. 基本计算器 - 力扣&#xff08;LeetCode&#xff09; 【进阶补充】双栈解决通用「表达式计算」问题 class Solution { public:void replace(string &s){int pos s.find(" ");while(pos ! -1){s.replace(pos, 1, "");pos s.find(" "…

树的搜索——leetcode

74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n matrix.size(), m matrix[0].size();int x 0, y m - 1;while(true){if(x > n || y < 0) r…

二叉树——leetcode

宫水三叶 230. 二叉搜索树中第K小的元素 - 力扣&#xff08;LeetCode&#xff09; 二叉搜索树的中序遍历是有序的&#xff0c;因此我们只需要对二叉搜索树执行中序遍历&#xff0c;并返回第 k 小的值即可。 class Solution { public:int ans -1;int cnt 0;int kthSmallest(T…

双指针——leetcode

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());int n nums.size();vector<vector<int>>ans;for(int i 0; i < n;…