zoukankan      html  css  js  c++  java
  • 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 ",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 ",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;
    }

  • 相关阅读:
    Excel—TIME函数简介与用法
    Excel—LEFT、RIGHT、MID函数提取不同位置的字段
    $scope.triggerSave $scope.createForm.dayType.$dirty = false;
    SVN clean up的作用
    js 获取当年到今日的时间区间
    jersey
    vector
    AngularJS 2
    URL 字符介绍
    JS factory
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5185534.html
Copyright © 2011-2022 走看看