1 条题解

  • 0
    @ 2023-10-18 10:01:27

    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
    上传者