給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。n,m≤30000。
輸入格式
第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。
輸出格式
共n行,表示每個點能夠到達的點的數量。
題解:從點x出發能夠到達的點構成的集合是f(x),有:
f(x)=u(u存在有向邊(x,y) f(y)),
從x出發能夠到達的點,是從「x的各個後繼點y」出發能夠到達的點的並集,再並上x自身。可以按照拓撲序的倒序進行計算。集合的並集計算可以利用狀態壓縮,用乙個n位的二進位制數表示可達的節點,bitset做乙個或運算即可。
#include
#include
#include
using namespace std;
typedef
long
long ll;
const
int maxn =
30000+5
;int n,m,cnt=0;
int n1,n2;
bitset bs[maxn]
;int ver[maxn]
,next[maxn]
,head[maxn]
,deg[maxn]
,a[maxn]
;int tot=0;
void
add(
int x,
int y)
void
topsort()
while
(q.size()
)}}int
main()
topsort()
;for
(int i=cnt;i>0;
--i)
}for
(int i=
1;i<=n;i++
)return0;
}
bitset用法和ch2101可達性統計
第一次嘗試使用markdown文字,可能編輯不好,見諒咕咕咕 題目咳咳下面步入正題,關於這種題目,看到的第一眼應該能想到相當於動規的遞推,但是要求邊界如果直接dfs,30000的資料不知道你家的棧能不能受的住 所以這個題目提供了乙個很好的思路,就是先求出拓撲序然後反過來乙個乙個求,這樣可以保證求當前...
2101 可達性統計
描述 給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。n,m 30000。輸入格式 第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出格式 共n行,表示每個點能夠到達的點的數量。1 include 2 include 3 include 4 ...
可達性統計
題目描述 給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。n,m 30000。輸入第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出共n行,表示每個點能夠到達的點的數量。樣例輸入 複製樣例資料 10 10 3 82 3 2 55 9 5 92...