注意点:
- 使用dfs的原因是后面的点会对之前点产生影响.
#include<cstdio> #include<iostream> #include<bitset> using namespace std; const int MAXN=3e4+5,MAXM=3e4+5; struct Edge{ int from,to,nxt; }e[MAXM]; int head[MAXN],edgeCnt=1; void addEdge(int u,int v){ e[++edgeCnt].from=u; e[edgeCnt].to=v; e[edgeCnt].nxt=head[u]; head[u]=edgeCnt; } bool vis[MAXN]; bitset<MAXN> cnt[MAXN]; void dfs(int x){ vis[x]=1; cnt[x].set(x,1); for(int i=head[x];i;i=e[i].nxt){ int nowV=e[i].to; if(!vis[nowV])dfs(nowV); cnt[x]|=cnt[nowV]; } } int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); addEdge(u,v); } for(int i=1;i<=n;i++){ if(!vis[i]) dfs(i); } for(int i=1;i<=n;i++) printf("%d\n",cnt[i].count()); return 0; }
原文地址:https://www.cnblogs.com/zbsy-wwx/p/11686844.html
时间: 2024-10-08 06:27:55