1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=30010,M=30010; int n,m; int h[N],e[M],ne[M],idx; int d[N],q[N]; bitset<M> f[N]; //位运算 void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void topsort() //拓扑排序模板 { int hh=0,tt=-1; for(int i=1;i<=n;i++) { if(!d[i]) { q[++tt]=i; } } while(hh<=tt) { int t=q[hh++]; for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(--d[j]==0) { q[++tt]=j; } } } } int main() { cin>>n>>m; memset(h,-1,sizeof h); for(int i=0;i<m;i++) { int a,b; cin>>a>>b; add(a,b); d[b]++; } topsort(); for(int i=n-1;i>=0;i--) //反向计算 { int j=q[i]; f[j][j]=1; //自己可以走到 for(int k=h[j];k!=-1;k=ne[k]) //枚举所有j可以走到的点 { f[j]|=f[e[k]]; //累加可以走到的点的数量 } } for(int i=1;i<=n;i++) cout<<f[i].count()<<endl; //统计i可以走到的点的数量 return 0; }
- 1
信息
- ID
- 790
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者