(我怎么又双叒叕发烧了...)
不难想到 对于一个生产者 它死了 所有它的子树就都死了
换句话说 对于一个消费者 它死 当且仅当它的所有食物都死了 什么时候所有食物都死了呢?——最顶端的生产者死了。否则,那消费者一定能至少找到一种食物
假如我们能够建出这样的一颗树就是极好的 不妨先来考虑建树的过程 对于新加入的点now 首先我们确定now是否为生产者 否则 将now放在食物们lca的儿子的地方即可
那肯定不能直接1~n枚举 这样找出来的LCA是错的 由于没有环 考虑拓扑先确定层次
#include<bits/stdc++.h>
const int N=65535;
using namespace std;
int n;
int first[N],tot;
struct Edge
{
int to,next;
}edge[2*N];
inline void addedge(int x,int y)
{
tot++;
edge[tot].to=y; edge[tot].next=first[x]; first[x]=tot;
}
int in[N],topo[N],num;
void Topo_sort()
{
queue <int> q;
for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
while(!q.empty())
{
int now=q.front();
q.pop();
topo[++num]=now;
for(int u=first[now];u;u=edge[u].next)
{
int vis=edge[u].to;
in[vis]--;
if(!in[vis]) q.push(vis);
}
}
}
vector <int> e[N];
int