知識點: 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會出現重複計算的情況,
樣例:33 答案: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...