【CH2101】可达性统计

这道题算是搜索和状压的结合吧,作为状压的入门题还是不错的,能让人初步了解状压的含义及应用。

对这张图进行一遍拓扑排序,然后状压统计(我用了bitset)。

注意读入,因为我的读入优化挂掉了……

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <bitset>
 5 using namespace std;
 6 int n,m;
 7 struct edge {
 8     int next,to;
 9 }a[30010<<1];
10 int num,head[30010<<1],b[30010<<1],tot,in[30010];
11 bitset<30010> f[30010];
12 queue<int> q;
13 inline void add(int from,int to) {
14     a[++num].next=head[from];
15     a[num].to=to;
16     head[from]=num;
17     in[to]++;
18 }
19 int main() {
20     cin>>n>>m;
21     for(int i=1;i<=m;i++) {
22         int x,y;
23         cin>>x>>y;
24         add(x,y);
25     }
26     for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
27     while(!q.empty()) {
28         int now=q.front();
29         q.pop();
30         b[++tot]=now;
31         for(int i=head[now];i;i=a[i].next) {
32             int v=a[i].to;
33             in[v]--;
34             if(!in[v]) q.push(v);
35         }
36     }
37     for(int i=tot;i;i--) {
38         int now=b[i];
39         f[now][now]=1;
40         for(int j=head[now];j;j=a[j].next) f[now]|=f[a[j].to];
41     }
42     for(int i=1;i<=n;i++) printf("%d
",f[i].count());
43     return 0;
44 }
AC Code
原文地址:https://www.cnblogs.com/shl-blog/p/10582042.html