codevs 1503 愚蠢的宠物

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1503 愚蠢的宠物相关的知识,希望对你有一定的参考价值。

妈呀我真是不知道怎么了裸题都要写挂~~~正宗倍增LCA啊~~~把bfs换成dfs就好了不知道为什么。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define maxv 1000005
#define maxe 1000005
using namespace std;
struct edge
{
int v,nxt;
}e[maxe];
int g[maxv],n,a,b,s,t,nume=0;
int anc[maxv][25],dis[maxv];
int ins[maxv],root;
queue <int> q;
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs(int u,int fath)
{
dis[u]=dis[fath]+1;
for (int i=g[u];i;i=e[i].nxt)
dfs(e[i].v,u);
}
void work(int x,int y)
{
if (x>y) swap(s,t);
for (int e=23;e>=0;e--)
{
if (dis[anc[t][e]]>=dis[s])
t=anc[t][e];
}
if (s==t)
{
printf("%d\n",s);
return;
}
for (int e=23;e>=0;e--)
{
if (anc[s][e]!=anc[t][e])
{
s=anc[s][e];
t=anc[t][e];
}
}
printf("%d\n",anc[s][0]);
return;
}
int main()
{
memset(g,0,sizeof(g));
memset(ins,0,sizeof(ins));
scanf("%d",&n);
for (int i=1;i<=n-1;i++)
{
scanf("%d%d",&a,&b);
addedge(a,b);
anc[b][0]=a;
ins[b]++;
}
for (int i=1;i<=n;i++)
{
if (ins[i]==0)
{
root=i;
break;
}
}
scanf("%d%d",&s,&t);
memset(dis,0,sizeof(dis));
dfs(root,0);
for (int e=1;e<=23;e++)
for (int i=1;i<=n;i++)
anc[i][e]=anc[anc[i][e-1]][e-1];
int x=dis[s],y=dis[t];
work(x,y);
return 0;
}

以上是关于codevs 1503 愚蠢的宠物的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1503 愚蠢的宠物

1503 愚蠢的宠物

1503 愚蠢的宠物

rqnoj 28[Stupid]愚蠢的宠物

《java精品毕设》基于javaweb宠物领养平台管理系统(源码+毕设论文+sql):主要实现:个人中心,信息修改,填写领养信息,交流论坛,新闻,寄养信息,公告,宠物领养信息,我的寄养信息等(代码片段

codevs1486愚蠢的矿工(树形dp)