HDU2545 树上战争【树+并查集】

树上战争

Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1263    Accepted Submission(s): 706

 

Problem Description

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

 

Input

输入包含多组数据
每组第一行包含两个数N,M(N,M<=100000),N表示树的节点数,M表示询问数,N=M=0表示输入结束。节点的编号为1到N。
接下来N-1行,每行2个整数A,B(1<=A,B<=N),表示编号为A的节点是编号为B的节点的父亲
接下来M行,每行有2个数,表示lxh和pfz的初始位置的编号X,Y(1<=X,Y<=N,X!=Y),lxh总是先移动
 

 
Output

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

 

Sample Input
 2 1
 1 2
 1 2
 5 2
 1 2
 1 3
 3 4
 3 5
 4 2
 4 5
 0 0

 

Sample Output
lxh 
pfz 
lxh

提示: 本题输入、输出都很多,请使用scanf和printf代替cin、cout。

 
Source

 

问题链接:HDU2545 树上战争

问题简述:参见上文。

问题分析:这是一个有关树的问题,可以构造一颗树来解决,类似于并查集中。哪个结点离树根更近则胜出。

程序说明:程序中,构建一个类似于并查集的树类,不过各个方法的逻辑已经不一样了。

 

AC的C++语言程序如下:

/* HDU2545 树上战争 */

#include <iostream>

using namespace std;

const int N = 100000;

// 树类:并查集类的变种
int v[N + 1];
class UFTree {
private:
    int length;
public:
    UFTree(int n) {
        length = n;
        for(int i=0; i<=n; i++)
            v[i] = i;
    }

    inline void Union(int x, int y) {
        v[y] = x;
    }

    inline int getDistance(int x) {
        int ans = 0;
        while(x != v[x]) {
            x = v[x];
            ans++;
        }
        return ans;
    }
};

int main()
{
    int n, m, a, b, distance1, distance2;

    while(scanf("%d%d",&n,&m) != EOF && (n || m)) {
        UFTree uft(n);

        for(int i=1; i<n; i++) {
            scanf("%d%d", &a, &b);

            uft.Union(a, b);
        }

        while(m--) {
            scanf("%d%d", &a, &b);

            distance1 = uft.getDistance(a);
            distance2 = uft.getDistance(b);

            printf(distance1 <= distance2 ? "lxh\n" : "pfz\n");
        }
    }

    return 0;
}

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值