p2597 灾难

我的思路

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
vector<int>death[100010];
vector<int>hunt[100010];
vector<int>tree[100010];
int ans[100010];
int in[100010];
int size[100010];
int st[100010][20];
int dep[100010];
int n;
queue<int>q;
int read()
{
    int s=0;
    char in=getchar();
    while(in<'0'||in>'9')
        in=getchar();
    while(in>='0'&&in<='9')
    {
        s=(s<<1)+(s<<3)+in-'0';
        in=getchar();
    }
    return s;
}
int lca(int a,int b)
{
    if(dep[a]<dep[b])
        swap(a,b);
    for(int i=18;i>=0;i--)
    	if(dep[a]-(1<<i)>=dep[b])
        	a=st[a][i];
    if(a==b)
        return a;
    for(int i=18;i>=0;i--)
        if(st[a][i]!=st[b][i])
        {
            a=st[a][i];
            b=st[b][i];
        }
    return st[a][0];
}
void solve(int x)
{
    int t=death[x][0];
    for(int i=1;i<death[x].size();i++)
        t=lca(t,death[x][i]);
    tree[t].push_back(x);
    st[x][0]=t;
    dep[x]=dep[t]+1;
    for(int i=1;i<=18;i++)
        st[x][i]=st[st[x][i-1]][i-1];
}
void topsort()
{
    int pass;
    for(int i=1;i<=n;i++)
        if(!in[i])
        {
            hunt[0].push_back(i);
            death[i].push_back(0);
            in[i]=1;
        }
    q.push(0);
    while(!q.empty())
    {
        pass=q.front();
        q.pop();
        for(int i=0;i<hunt[pass].size();i++)
        {
            in[hunt[pass][i]]-=1;
            if(!in[hunt[pass][i]])
            {
                solve(hunt[pass][i]);
                q.push(hunt[pass][i]);
            }
        }
    }
}
void dfs(int x)
{
    ans[x]=1;
    for(int i=0;i<(int)tree[x].size();i++)
    {
        dfs(tree[x][i]);
        ans[x]+=ans[tree[x][i]];
    }
    return ;
}
int main()
{
    n=read();
    int a;
    for(int i=1;i<=n;i++)
    {
        a=read();
        while(a)
        {
            death[i].push_back(a);
            hunt[a].push_back(i);
            in[i]+=1;
            a=read();
        }
    }
    topsort();
    dfs(0);
    for(int i=1;i<=n;i++)
        printf("%d\n",ans[i]-1);
}

posted @ 2018-04-14 19:49  Lance1ot  阅读(164)  评论(0编辑  收藏  举报