树上战争 HDU-2545
生活随笔
收集整理的這篇文章主要介紹了
树上战争 HDU-2545
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樹上戰爭
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 UESTC 6th Programming Contest Online
題解:
第一次做的時候,我找的是離lxh和pfz最近的那個公共根節點,不是最上面的根節點,這樣寫由于需要判斷是否是公共根節點、是否是最近的等等,所以一直超時。后來直接找最上面的根節點,誰先找到誰就贏,用的類似并查集的思想。
代碼:
#include<stdio.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; int tree[100100],f[100100];int findl(int u) {int num=0;while(f[u]!=u){u=f[u];num++;}return num; }int main() {int n,m;while(scanf("%d%d",&n,&m)&&(m+n)){int a,b,e,s,i,j;for(i=0;i<=n;i++)f[i]=i;for(i=0; i<n-1; i++){scanf("%d%d",&a,&b);f[b]=a;}for(i=0; i<m; i++){scanf("%d%d",&s,&e);if(findl(s)<=findl(e))printf("lxh\n");else printf("pfz\n");}} }總結
以上是生活随笔為你收集整理的树上战争 HDU-2545的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uniapp实现附有二维码的图片的本地保
- 下一篇: SHEN ZHEN归来!