BZOJ4562 [Haoi2016]食物链

来源:互联网 发布:路由器mac地址查询 编辑:程序博客网 时间:2024/05/22 17:11

f[x]表示到x为结尾的食物链条数,g[x]表示还没给出边传过去的食物链条数,拿spfa跑一遍即可,其实直接记忆化搜索就行,当时想到了BZ上拿魔法或者物理打怪那题,就傻逼一样写了个用spfa跑的递推-_-

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<iomanip>#include<ctime>#include<cmath>#include<map>#include<bitset>#include<stack>#include<queue>#include<set>#include<vector>using namespace std;#define ll long long #define MAXN 200010#define MAXM 200010#define INF 2000000000#define MOD 2000000007#define QMOD 200000struct vec{    int to;    int fro;};vec mp[MAXM];int tai[MAXN],cnt;int n,m;int d[MAXN];int q[MAXN*10],h,t;int f[MAXN],g[MAXN];bool iq[MAXN];int ans;inline void be(int x,int y){    mp[++cnt].to=y;    mp[cnt].fro=tai[x];    tai[x]=cnt;}int main(){    int i;    int ix,iy;    scanf("%d%d",&n,&m);    for(i=1;i<=m;i++){        cin>>ix>>iy;        be(ix,iy);        d[iy]++;    }    for(i=1;i<=n;i++){        if(!d[i]){            q[t++]=i;            if(tai[i]){                f[i]=g[i]=1;            }            iq[i]=true;            t%=QMOD;        }    }    int x,y;    while(h!=t){        x=q[h++];        h%=QMOD;        iq[x]=false;        for(i=tai[x];i;i=mp[i].fro){            y=mp[i].to;            f[y]+=g[x];            g[y]+=g[x];            if(!iq[y]){                q[t++]=y;                t%=QMOD;                iq[y]=true;            }        }        g[x]=0;    }    for(i=1;i<=n;i++){        if(!tai[i]){            ans+=f[i];        }    }    printf("%d\n",ans);    return 0;}   /*4a eb ec ed e            */


0 0
原创粉丝点击