NC15520. 黑黑白白
描述
艮为山,动静得宜,适可而止;兑为泽,刚内柔外,上下相和。
艮卦:兼山,艮;君子以思不出其位。财帛常打心头走,可惜眼前难到手,不如意时且忍耐,逢着闲事休开口。
兑卦:丽泽,兑;君子以朋友讲习。这个卦象真可取,觉着做事不费力,休要错过这机关,事事觉得随心意。
输入描述
第一行一个数 ,表示有 组数据。接下去每组数据的第一行有两个数 ,表示树有 个节点,其中 为根节点编号(从 开始编号)。接下去 行每行两个数字 ,表示点 和 之间有一条边。
输出描述
每组数据输出一行, 表示先手有必胜策略, 表示没有。
示例1
输入:
2 3 1 1 2 2 3 5 4 1 2 1 3 3 4 4 5
输出:
Dui Gen
C++14(g++5.4) 解法, 执行用时: 41ms, 内存消耗: 1700K, 提交时间: 2020-09-26 15:18:39
#include<iostream> #include<vector> using namespace std; vector<int>mp[10001]; int t,n,r,u,v; bool dfs(int x,int f){ int len=mp[x].size();//当前节点的分支个数 for(int i=0;i<len;i++){ int xx=mp[x][i];//当前节点的分支节点 if(xx!=f && !dfs(xx,x)){// xx!=f不可以是环 ,判断xx节点的分支节点,同时保证了奇数为true return true; } } return false; } int main(){ cin>>t; while(t--){ cin>>n>>r; for(int i=0;i<=n;i++){ mp[i].clear(); } for(int i=1;i<n;i++){ cin>>u>>v; mp[u].push_back(v); mp[v].push_back(u); } cout<<(dfs(r,-1)?"Gen\n":"Dui\n");//从根节点出发 } return 0; }
Python3(3.5.2) 解法, 执行用时: 507ms, 内存消耗: 8768K, 提交时间: 2018-11-11 11:25:07
import sys sys.setrecursionlimit(10**6) T = int(input()) def dfs(u, p, e, a): for v in e[u]: if v != p: dfs(v, u, e, a) if a[v]: a[u] = False return a[u] = True while T > 0 : T -= 1 n, r = map(int, input().split()) e = [[] for i in range(n)] a = [False] * n for i in range(n - 1): u, v = map(int, input().split()) e[u - 1].append(v - 1) e[v - 1].append(u - 1) dfs(r - 1, -1, e, a) print('Gen' if not a[r - 1] else 'Dui')
C++11(clang++ 3.9) 解法, 执行用时: 70ms, 内存消耗: 1796K, 提交时间: 2020-01-28 17:03:39
#include<bits/stdc++.h> #define rep(i,s,e) for(int i=s; i<e; ++i) using namespace std; vector<int>vv[10005]; int dfs(int x,int f){ for(int t:vv[x]) if(t!=f&&!dfs(t,x)) return 1; return 0; } int main(){ int _; cin>>_; while(_--){ int n,r; cin>>n>>r; rep(i,1,n+1) vv[i].clear(); rep(i,1,n){ int u,v; cin>>u>>v; vv[u].push_back(v); vv[v].push_back(u); } puts(dfs(r,0)?"Gen":"Dui"); } }