Gym 100685G Gadget Hackwrench(LCA)

原创 2016年08月31日 16:08:15
题目地址:http://codeforces.com/gym/100685/problem/G

思路:不考虑方向,则该图构成一棵树。对于每条有向边:对于正向边,权值为1;对于反向边,权值为-1。则对于一组查询(x,y),若有向图中Lca(x,y)到x距离为负且等于树中Lca(x,y)到x的距离,有向图中Lca(x,y)到y距离为正且等于树中Lca(x,y)到y的距离,则x,y连通。

#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debu
using namespace std;
const int maxn=1e5+50;
struct Node
{
    int p,id;
    Node(int p=0,int id=0):p(p),id(id) {}
};
int n;
queue<int> q;
int vis[maxn];
int dist[maxn];
int anc[maxn][20];
int v[maxn],d[maxn];
vector<Node> g[maxn];
void lca_dfs(int x,int dep)
{
    v[x]=1,d[x]=dep;
    for(int i=0; i<g[x].size(); i++)
    {
        int nt=g[x][i].p;
        if(!v[nt])
        {
            dist[nt]=dist[x]+g[x][i].id;
            anc[nt][0]=x;
            int k=0;
            while(anc[anc[nt][k]][k]!=0)
            {
                anc[nt][k+1]=anc[anc[nt][k]][k];
                k++;
            }
            lca_dfs(nt,dep+1);
        }
    }
}
int Lca(int x,int y)
{
    if(d[x]<d[y]) swap(x,y);
    int l=d[x]-d[y];
    int k=0;
    while(l!=0)
    {
        if(l&1) x=anc[x][k];
        l>>=1;
        k++;
    }
    k=0;
    while(x!=y)
    {
        if((anc[x][k]!=anc[y][k])||(!k))
        {
            x=anc[x][k];
            y=anc[y][k];
            k++;
        }
        else k--;
    }
    return x;
}
void init()
{
    memset(d,0,sizeof(d));
    memset(vis,0,sizeof(vis));
    memset(anc,0,sizeof(anc));
    memset(dist,0,sizeof(dist));
    for(int i=1; i<=n; i++) g[i].clear();
}
void build()
{
    memset(v,0,sizeof(v));
    for(int i=1;i<=n;i++)
        if(!v[i]) lca_dfs(i,0);
}
void query()
{
    int q;
    scanf("%d",&q);
    while(q--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        int lca=Lca(x,y);
        int tmpx=d[x]-d[lca];
        int tmpy=d[y]-d[lca];
        int distx=dist[x]-dist[lca];
        int disty=dist[y]-dist[lca];
        if(tmpx==-distx&&tmpy==disty) printf("Yes\n");
        else printf("No\n");
    }
}
int main()
{
#ifdef debug
    freopen("in.in","r",stdin);
#endif // debug
    scanf("%d",&n);
    init();
    for(int i=1; i<=n-1; i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        g[x].push_back(Node(y,1));
        g[y].push_back(Node(x,-1));
        vis[y]=1;
    }
    build();
    query();
    return 0;
}


Gym 100685G Gadget Hackwrench (LCA)

题意: 给一个V≤105有向的,但是忽略方向是一颗树的「树」,每次查询u→v是否可达,Q≤105给一个 V≤10^5 有向的,但是忽略方向是一颗树的「树」,每次查询 u\to v 是否可达,Q≤1...
  • lwt36
  • lwt36
  • 2015年10月05日 21:18
  • 502

Gym 100685G Gadget Hackwrench(LCA)

题目链接:点击打开链接 题意:输入n,然后n-1行输入每条u到v的有向边,然后q个询问,询问能否从s点到e点。 分析:n-1条边很明显是一棵树,我们以任意点为根节点建立一棵树,然后求出各个点到树根...
  • Robincin_S
  • Robincin_S
  • 2015年10月12日 11:34
  • 587

Codeforces/gym/100685/problem/G Gadget Hackwrench ( LCA )

Codeforces/gym/100685/problem/G Gadget Hackwrench ( LCA )
  • u013790563
  • u013790563
  • 2015年10月04日 21:00
  • 405

Gym 100685 G Gadget Hackwrench LCA+DFS标记

G. Gadget Hackwrench time limit per test 2 seconds memory limit per test 64 megabytes ...
  • gaoxiang36999
  • gaoxiang36999
  • 2015年10月04日 20:20
  • 472

Gym 100685G

好坑啊。。。。查询竟然有从自身到自身。。。还是年轻啊。。 题意大致是给你一个有向图,然后给你一些查询,问你是否能从x点到y点,题意保证这个图的基图是一个树。 思路:首先因为将任何点作为根都可以,为...
  • YaphetS_FC
  • YaphetS_FC
  • 2016年09月05日 18:47
  • 169

Linux-USB Gadget(小玩意) API Framework(框架)

Linux-USB Gadget(小玩意) API Framework(框架) Last Modified: 8 June 2005 The  API makes it easy for peri...
  • a350203223
  • a350203223
  • 2014年10月30日 13:58
  • 2192

Linux USB gadget设备驱动解析(4)--编写一个gadget驱动

分类: LINUX 作者:刘洪涛,华清远见嵌入式学院讲师。 一、编写计划 通过前面几节的基础,本节计划编写一个简单的gadget驱动。重在让大家快速了解gadget驱动结构。 ...
  • wujiangguizhen
  • wujiangguizhen
  • 2013年11月21日 17:02
  • 1853

Linux系统中的gadgetfs介绍

Linux提供了一套API,使得嵌入式的Linux系统软件可以以USB外设的方式工作。Kernel中提供了Gadget的Framework及相关的Demo,开发者可以参考用于开发自己的USB Gadg...
  • coroutines
  • coroutines
  • 2014年10月31日 09:58
  • 2628

Gym 101161E 主席树+LCA

题意给一棵树,问树上路径权值中位数。题解树上路径权值中位数就是求第k/2大数,很明显主席树+LCA。这道题还是比较容易的,有一点非常重要的是权值W的范围是1-100000,这个范围很大程度上影响了题目...
  • zhenlingcn
  • zhenlingcn
  • 2017年10月19日 22:19
  • 59

简单记录一下Linux gadget serial的工作

Linux支持连接各种USB从设备,同时也支持自己作为设备插入到其他主机当中。最典型的例子就是Android OS的手机,插入电脑可以被识别为U盘之类的设备。 对于SOC来说,这部分直接对应了U...
  • EmbededSwordman
  • EmbededSwordman
  • 2011年08月15日 21:09
  • 5318
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gym 100685G Gadget Hackwrench(LCA)
举报原因:
原因补充:

(最多只允许输入30个字)