upc 可達性統計 (拓撲排序 bitset)

2021-09-26 14:09:04 字數 1132 閱讀 7799

題目描述

給定一張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 9樣例輸出

163

3211

111

拓撲排序是一種對點進行排序的演算法,如果有一條有向邊u->v,那麼在排好序的點的序列中,v一定在u的後面。

簡述:先找入度為零的點,加入陣列,以它為起點,剪去以它作為起點的邊,再找入度為零的點,加入陣列,最後的到乙個點的序列

再說一下這個bitset庫  bitset<30005>a[30005] 可以說開了以「陣列」叫a,大小是30005,乙個資料型別儲存30005位,

排好序後,從後往前,因為後面的數能到達的點一般情況下是比前面的點少的,用後面的點去更新前面的點

上**吧:

#include#include#include#include#include#include#includeusing namespace std;

const int inf=0x7f;

const int maxn=30000+10;

const int maxm=30000+10;

int n,m,x,y,k,ans,ind[maxn],vis[maxn],head[maxm];

vectorv;

bitseta[maxn];

struct edge

e[maxm];

void add(int u,int v)

void init()

void bfs(int s)

} }}void tsort()

for(int i=1;i<=n;i++) }

int main()

for(int i=1;i<=n;i++)

printf("%lld\n",a[i].count());

return 0;

}

拓撲排序 可達性統計

給定一張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...