可達性統計 拓撲排序 狀態壓縮)

2021-10-01 02:12:11 字數 998 閱讀 2486

題意:給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量

思路:該題的暴力做法就是從每個點開始dfs,就能得到每個點最多可到達的點的數量,但很明顯會超時。先對圖進行拓撲排序,這樣可以由拓撲序由後向前遞推。一種很妙的做法是使用bitset進行狀態壓縮,用乙個3000位的二進位制數來表示乙個點的狀態,對於第i個點,考慮與其直接相連的邊,如果j與其相連,則該二進位制的第j位為1。可以看到,當我們按照拓撲序逆著遍歷時,每個點所指向的其他點必定都被考慮過了,故此點的狀態等於之前其他點的狀態的bitwise or和。

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

3e4+5;

int n, m;

int in_degree[maxn]

;int head[maxn]

, tot;

struct edgeedge[maxn]

;void

addedge

(int u,

int v)

int a[maxn]

, cnt;

void

toposort()

while

(!q.

empty()

)}}}

bitset f[maxn]

;void

solve()

}}intmain()

toposort()

;solve()

;for

(int i =

1; i <= n;

++i)

cout << f[i]

.count()

<< endl;

return0;

}

拓撲排序 可達性統計

給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。輸入格式 第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出格式 輸出共n行,表示每個點能夠到達的點的數量。資料範圍 1 n,m 300001 n,m 30000 輸入樣例 10 10 3 82...

可達性統計(拓撲排序)

給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。n,m 30000。第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。共n行,表示每個點能夠到達的點的數量。10 10 3 82 3 2 55 9 5 92 3 3 94 8 2 10 4 9163...

可達性統計 拓撲排序 bitset

給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。輸入格式 第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出格式 輸出共n行,表示每個點能夠到達的點的數量。資料範圍 1 n,m 30000 輸入樣例 10 10 3 82 3 2 55 9 5...