这道题算是搜索和状压的结合吧,作为状压的入门题还是不错的,能让人初步了解状压的含义及应用。
对这张图进行一遍拓扑排序,然后状压统计(我用了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 }