1 条题解

  • 0
    @ 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
    标签
    递交数
    99
    已通过
    41
    上传者