核彈劍仙(拓撲 bitset)

2022-08-10 08:42:12 字數 1214 閱讀 8532

知識點: bitset+拓撲排序

題目大意:有n把**,依次編號為1~n,已知m條資訊,eg: **a比**b的威力大,

output:      輸出n行,第 i 行表示明確比** i 威力大的**數量

題解:當a>b,則比a大的**一定也大於b,所以ans[b]應該加上ans[a]及a本身,但是如果普通的佇列+拓撲,ans[b]+=ans[a]+1會出現重複計算的情況,

樣例:3

3 答案:0 ans[1]=0

123 ans[2]=ans[3]+1+ans[1]+1=2*(ans[1]+1)+1

131 ans[3]=ans[1]+1

32 //第2行答案應該是2,但是1被重複計算了兩遍

所以利用bitset來記錄,bitset < 1010 > g [ 1010 ] , g [ i ] [ j ] 表示** j 比** i 的威力大,結果只需要統計g [ i ] 1 的個數即可

g [ b ] | = g [ a ]     //繼承a的狀態

g [ b ] [ a ] = 1       //標記

**:

#include#include

#include

#include

#include

using

namespace

std;

bitset

<1010>g[1010

];queue

q;vector

ve[1010

];int

in[1010

];void

bfs()

}}int

main()

while(!q.empty())q.pop();

memset(

in,0,sizeof(in

));

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

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

if(in[i]==0

)q.push(i);

bfs();

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

printf(

"%d\n

",g[i].count());

}return0;

}

HDU 5413 拓撲排序 BITSET

題意 給定一張有向圖,對於邊 ev 如果去掉它的話,u仍然可以到達v的話,那麼這條邊就是多餘邊。解法 顯然的乙個思路是倒著做。先topo一遍,然後倒著來,這裡需要用到bitset維護每個點可以和哪些點直接相連,利用bitset是為了不超記憶體,然後用bitset處理出關係之後就可以遍歷尋找答案了。i...

可達性統計 拓撲排序 bitset

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

0x20 拓撲排序,bitset

拓撲排序,鏈式前向星,bitset 給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。const int n 30020 int n,m struct edgeedge n int head n cnt int in n seq n 拓撲排序後的序列 bitsetf n vo...