码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 1503 愚蠢的宠物

时间:2016-02-09 15:05:03      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:

妈呀我真是不知道怎么了裸题都要写挂~~~正宗倍增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 愚蠢的宠物

标签:

原文地址:http://www.cnblogs.com/ziliuziliu/p/5185534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!