hdu2545(简单并查集)

news/2024/11/16 6:42:33/

树上战争

Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 543    Accepted Submission(s): 290
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545


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 11 21 25 21 21 33 43 54 24 50 0

Sample Output
  
lxhpfzlxh提示: 本题输入、输出都很多,请使用scanf和printf代替cin、cout。
解题思路:
并查集题。思想就是建立联系时不一次建立到根节点,而是只找到父节点即可。最后一定能建立一棵树,那么利用find函数的路径压缩来求得每个结点的深度,如果x节点的深度大于y节点的深度,那么pfz一定赢,否则lxh一定赢。
完整代码:
#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <climits>
#include <cassert>
#include <complex>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;
typedef double DB;
typedef unsigned uint;
typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f3f3f3f3f3f3fLL;
const DB EPS = 1e-9;
const DB OO = 1e20;
const DB PI = acos(-1.0); //M_PI;
const int maxn = 100001;
int f[maxn];
int s[maxn];
void init()
{for(int i = 0 ; i <= maxn ; i ++)f[i] = i;
}void find(int x , int &cnt)
{if(x == f[x])return ;else{cnt++;find(f[x] , cnt);}
}int main()
{#ifdef DoubleQfreopen("in.txt","r",stdin);#endifint n , m;while(~scanf("%d%d",&n,&m)){init();if(n == 0 && m == 0)break;int a , b;for(int i = 0 ; i < n - 1 ; i ++){scanf("%d%d",&a , &b);f[b] = a;}int x , y;for(int i = 0 ; i < m ; i++){scanf("%d%d",&x,&y);int cnt1 = 0 , cnt2 = 0;find(x , cnt1);find(y , cnt2);if(cnt1 > cnt2)printf("pfz\n");elseprintf("lxh\n");}}
}



http://www.ppmy.cn/news/303981.html

相关文章

hdu 2545

链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2545 并查集解决. AC code: #include <iostream> #include <stdio.h> using namespace std; #define Max 100001 int father[Max]; void Init() {int i;for(i0;i<Max;i)father[i]i; }int Findfat…

ZSTU2545-地道战

http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id2545 呵呵。。。呵呵。。。呵呵。。。 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main(void) {int n,m,i,j,k,g,dp[120][120],x[120][120],y[120][12…

ZOJ 2545 Factstone Benchmark

求最大的n 满足n! < 2 ^k 2 ^ k 不会太大,所以可以直接暴力上去. 设2 ^ k 为p 则有:n! < p ---> log2(n!) < log2(p) ---> log(n!) < p ---> log2(1) log(2) log(3) .... log2(n) < p #include <iostream> #include <cstdio> #incl…

HDU2545:树上战争(并查集)

树上战争 Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1012 Accepted Submission(s): 572 Problem Description 给一棵树&#xff0c;如果树上的某个节点被某个人占据&#xff0c;则它的所有儿子都被占据…

2545: 内部收益率

2545: 内部收益率 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 25 Solved: 8 [ Submit][ Status][ Web Board] Description 在金融中&#xff0c;我们有时会用内部收益率IRR来评价项目的投资财务效益&#xff0c;它等于使得投资净现值NPV等于0的贴现率。换句话说&#x…

【光学】基于matlab GUI维达尔之眼计算【含Matlab源码 2545期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【光学】基于matlab GUI维达尔之眼计算【含Matlab源码 2545期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏Matlab物理应用(初级版) 备注: 点击上面蓝色字体付费专栏Matlab物理应用(…

hdu 2545 树上战争

//只需求出两个节点到达公共祖先节点所走的次数&#xff0c;只要求出节点到最原始祖先节点的次数 //并差集 #include<stdio.h> int f[100002]; int find(int a) {int cont0;while(f[a]!a){cont;af[a];}return cont; } int main() {int i,a,b,n,m;while(scanf("%d%d…

洛谷P2545 [AHOI2004]实验基地

题目描述 输入输出格式 输入格式&#xff1a; 第一行有一个整数N(3<N<2000)&#xff0c;表示登陆地带的大小是2N。随后的两行每一行有N个整数&#xff08;其绝对值不超过10^6&#xff09;&#xff0c;表示对应的矩形土地的适用度评估值&#xff0c;各个整数之间用一个空…