码迷,mamicode.com
首页 > 其他好文 > 详细

可达性统计

时间:2019-07-31 14:44:00      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:www   统计   space   getch   gis   https   names   return   null   

可达性统计

给出一个n个点m条边的有向无环图,求每个点能到达的点的数目,\(n,m\leq 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\n",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();
}

可达性统计

标签:www   统计   space   getch   gis   https   names   return   null   

原文地址:https://www.cnblogs.com/a1b3c7d9/p/11276063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!