洛谷P1751贪吃虫

这篇博客介绍了如何使用深度优先搜索策略解决洛谷P1751题目的贪吃虫问题。首先通过DFS计算每只虫子在食物出现后的路径,然后进行第二次DFS确定虫子停止的位置。当搜索到某个节点时,如果该节点是虫子的最后落脚点且虫子未被标记,则标记虫子并结束搜索。
摘要由CSDN通过智能技术生成

思路:

快速计算出每只虫子在食物降临后的位置(以食物节点为根)。

第一遍 DFS:计算每个节点 k 步后被贪吃虫 w 占据。

第二遍 DFS:计算贪吃虫 w 走 t 步到 pos 停止。

搜索到节点 u ,若最先占据该点的虫子 w 没有被访问过,则此处为虫子的最后落脚点,并把该虫子标记为已访问。

AC代码:

#include<bits/stdc++.h>
const int N=5015,K=1003;
int n,hd[N],nx[N*2],vt[N*2],cnt,k,psw[N],ans[K];
void add(int u,int v){++cnt;nx[cnt]=hd[u];vt[cnt]=v;hd[u]=cnt;}
int occ[N],tim[N],last[K],cpos[K],opos[K];
void formtree(int u,int fa){
    int nwrm,ntim,vwrm,vtim;
    if(psw[u])nwrm=psw[u],ntim=0;
    else nwrm=9999,ntim=9999;
    for(int i=hd[u];i;i=nx[i])if(vt[i]!=fa){
        formtree(vt[i],u);vwrm=occ[vt[i]],vtim=tim[vt[i]]+1;
        if(vtim<ntim||(vtim==ntim&&vwrm<nwrm))nwrm=vwrm,ntim=vtim;
    }
    occ[u]=nwrm;tim[u]=ntim;
}
void scantree(int u,int fa){
    int wmcu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值