zoukankan      html  css  js  c++  java
  • cdoj 树上战争(Battle on the tree) Label:并查集?

    给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜。

    Input

    输入包含多组数据

    每组第一行包含两个数NN,MM(NN,M≤100000M≤100000),NN表示树的节点数,MM表示询问数,N=M=0N=M=0表示输入结束。节点的编号为11到NN。

    接下来N−1N−1行,每行22个整数AA,BB(1≤A1≤A,B≤NB≤N),表示编号为AA的节点是编号为BB的节点的父亲。

    接下来MM行,每行有22个数,表示lxh和pfz的初始位置的编号XX,YY(1≤X1≤X,Y≤NY≤N,X≠YX≠Y),lxh总是先移动。

    Output

    对于每次询问,输出一行,输出获胜者的名字。

    Sample input and output

    Sample Input

    Sample Output

    2 1

    1 2

    1 2

    5 2

    1 2

    1 3

    3 4

    3 5

    4 2

    4 5

    0 0

    lxh

    pfz

    lxh

    Source

    电子科技大学第六届ACM程序设计大赛 初赛

    代码

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<vector>
     5 #include<algorithm>
     6 using namespace std;
     7 int dis[100005],fa[100005];//dis到根节点距离 
     8 int n,m;
     9 
    10 int Find(int x){
    11     if(dis[x]>0) return dis[x];
    12     
    13     if(x==fa[x]) return 0;
    14     else return dis[x]=Find(fa[x])+1;
    15 }
    16 void init_(){
    17     memset(dis,0,sizeof(dis));
    18     for(int i=1;i<=n;i++) fa[i]=i;
    19 }
    20 int main(){
    21 //    freopen("01.in","r",stdin);
    22     while(scanf("%d%d",&n,&m)==2&&n>0&&m>0){
    23         init_();
    24         for(int i=1;i<n;i++){
    25             int u,v;
    26             scanf("%d%d",&u,&v);
    27             fa[v]=u;
    28         }
    29         while(m--){
    30             int u,v;
    31             scanf("%d%d",&u,&v);
    32             
    33             if(Find(u)<=Find(v))puts("lxh");
    34             else puts("pfz");
    35         }
    36     }
    37     return 0;
    38 }

    谁离根近谁胜利

    之前写了个dfs最短路不知道为什么错了,待定!!!

    结论大概是初始化有问题,待改!!!

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/radiumlrb/p/5905708.html
Copyright © 2011-2022 走看看