(我怎么又双叒叕发烧了...)
不难想到 对于一个生产者 它死了 所有它的子树就都死了
换句话说 对于一个消费者 它死 当且仅当它的所有食物都死了 什么时候所有食物都死了呢?——最顶端的生产者死了。否则,那消费者一定能至少找到一种食物
假如我们能够建出这样的一颗树就是极好的 不妨先来考虑建树的过程 对于新加入的点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 father[N],depth[N],up[N][20];
inline int getlca(int x,int y)
{
if(depth[x]<depth[y]) swap(x,y);
fo

该博客探讨了如何利用拓扑排序和最近公共祖先(LCA)算法解决ZJOI2012竞赛中的‘灾难’问题。文章指出,当生产者节点死亡时,其子树会受到影响;而消费者只有在其所有食物来源(生产者)都死亡时才会死亡。解决方案包括构建反映这种依赖关系的树,并强调不能简单地按顺序枚举节点以计算LCA,因为这可能导致错误。作者提出要考虑拓扑层次来正确处理问题。
最低0.47元/天 解锁文章
421

被折叠的 条评论
为什么被折叠?



