• 可达性统计


    可达性统计

    给出一个n个点m条边的有向无环图,求每个点能到达的点的数目,(n,mleq 30000)

    (f[i])表示点i能到达的点的状态(其中1表示能够到达,0表示不能到达),显然有30000个点,所以我们无法用long long存下,于是用bitset,问题在于这个方程没有明显的阶段,不能循环实现,于是可以考虑拓扑排序或者是dfs。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <bitset>
    #include <queue>
    #define il inline
    #define ri register
    #define Size 30000
    using namespace std;
    struct point{
    	point*next;int to;
    }*head[Size],*pt;
    int in[Size];
    il void read(int&),
    	link(int,int);
    queue<int>Q;
    bitset<Size>a[Size];
    int main(){
    	int n,m,i,j;read(n),read(m);
    	while(m--)read(i),read(j),--i,--j,
    				  link(j,i),++in[i];
    	for(int i(0);i<n;++i)
    		if(a[i].set(i),!in[i])Q.push(i);
    	while(Q.size()){
    		i=Q.front(),Q.pop();
    		for(pt=head[i];pt!=NULL;pt=pt->next){
    			--in[pt->to],a[pt->to]|=a[i];
    			if(!in[pt->to])Q.push(pt->to);
    		}
    	}for(int i(0);i<n;++i)printf("%lu
    ",a[i].count());
    	return 0;
    }
    il void link(int u,int v){
    	head[u]=new point{head[u],v};
    }
    il void read(int &x){
    	x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');
    	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
    }
    
    
  • 相关阅读:
    JAXB
    Servlet编码和解码
    FileUpload
    DataSource
    20200821 二分搜索
    火狐账户如何在Android手机端与电脑端同步
    20200807 贪心;排队接水;[AHOI2018初中组]分组;国王的游戏
    20200802 高精度问题 阶乘之和
    20200803 牛客多校赛
    20200207
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11276063.html
Copyright © 2020-2023  润新知