可達性統計

2021-09-23 14:11:12 字數 1295 閱讀 4490

題目描述

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

3321

1111

這道題利用的是拓撲排序+bitset

這一步驟是用來建立拓撲排序,

拓撲排序主要思想是先將沒有入度的點排在前面,然後再將這個點以及這個點的弧去掉,再從剩下的點找到沒有入度的點,依次,直到所有的點都找完

void fun()//構成拓撲排序 

while(!a.empty())

} }}

這段程式結束後,f中的值為

1 2 4 6 7 3 5 10 8 9

這個前面的點在圖中肯定比後面的點先訪問,(當然也會有並例的存在)

此時就要用到bitset

bitset<30005>a[30005];
這樣的定義表示每乙個a[?]的資料型別佔30005位,每個點都可以訪問自己,所以a[x][x]=1,表示肯定有乙個,然後再訪問與這個點相連的點中的1的個數,進行或運算

所以要從後往前

for(int i = n;i >= 1;i--)

}

a[i].count(),這個則表示a[i]裡面1的個數,也就是與i這個點相連的點有個數

#include #include #include #include using namespace std;

vectorg[30005];

int ans;

int n,m;

bitset<30005>a[30005];

int f[300005];

int vis[300005];

void fun()//構成拓撲排序

while(!a.empty())

} }}int main()

if(j == g[x].size())

}fun();

for(int i = n;i >= 1;i--)

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

return 0;

}

可達性統計

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

可達性統計

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

問題 A 可達性統計

題目 法一 過程 一開始我直接拿bfs跑,沒有用去重,導致乙個節點重複算了多次,使用了bitset的位運算 去重後,答案才對,bitset 好 bitset還省空間 bitset陣列類似與bool陣列,但是省空間 思路 前向星建圖,將所有的visit u u 初始化為1 自己和自己相連 如果乙個點u...