1 条题解
-
0陈烨鑫 (chenyexin) LV 10 @ 2023-5-24 19:12:18
解法1
#include <bits/stdc++.h> using namespace std; const int N=30007,M=N; int h[N],e[M],ne[M],idx; int n,m; int din[N]; bitset<N> f[N]; vector<int> v; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } int main() { memset(h,-1,sizeof h); cin >>n>>m; for(int i=0;i<m;i++) { int a,b; cin >>a>>b; add(a,b); din[b]++; } queue<int> q; for(int i=1;i<=n;i++) { if(!din[i]) q.push(i); } while(q.size()) { int x=q.front(); v.push_back(x); q.pop(); for(int i=h[x];~i;i=ne[i]) { int j=e[i]; if(--din[j]==0) q.push(j); } } reverse(v.begin(),v.end()); for(auto i : v) { f[i][i]=1; for(int j=h[i];~j;j=ne[j]) { int k=e[j]; f[i]|=f[k]; } } for(int i=1;i<=n;i++) cout <<f[i].count()<<endl; }
解法2
#include <iostream> #include <bitset> #include <queue> using namespace std; typedef long long ll; const int maxn = 30000+5; int n,m,cnt=0; int n1,n2; bitset<maxn> bs[maxn]; int ver[maxn],Next[maxn],head[maxn],deg[maxn],a[maxn]; int tot=0; void add(int x,int y){ ver[++tot]=y,Next[tot]=head[x],head[x]=tot; deg[y]++; } void topsort(){ queue<int> q; for(int i=1;i<=n;i++){ if(deg[i] == 0) q.push(i); } while(q.size()){ int x = q.front(); q.pop(); a[++cnt] = x; for(int i=head[x];i;i=Next[i]){ int y = ver[i]; if(--deg[y]==0) q.push(y); } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&n1,&n2); add(n1,n2); } topsort(); for(int i=cnt;i>0;--i){ int x = a[i]; bs[x][x]=1; for(int j=head[x];j;j=Next[j]){ int y=ver[j]; bs[x]=bs[x]|bs[y]; } } for(int i=1;i<=n;i++){ cout<<bs[i].count()<<endl; } return 0; }
- 1
信息
- ID
- 75
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 98
- 已通过
- 40
- 上传者