链接:
https://www.nowcoder.com/acm/contest/86/F
只要子儿子存在一个p,那么当前这个节点就为n,反之如果儿子全部都是n,那么当前节点就为p,dfs就可以解决,我在初始化vector的时候少打了一个=,wa两次,还是太粗心
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #define ll long long using namespace std; void dis(int a[], int n){ printf("总数为%d个\n",n); for(int i = 0; i < n; i++) cout<<a[i]<<", "; cout<<endl<<"------------------"<<endl; } const int mx = 1e4+10; int vis[mx]; int T,n,r; vector<int>ma[mx]; int dfs(int x){ vis[x] = 1; int flag = 0; for(int i = 0; i <ma[x].size(); i++){ int z = ma[x][i]; if(!vis[z]){ if(dfs(z) == 0) flag = 1; } } if(flag) return 1; return 0; } int main(){ int a,b; scanf("%d",&T); //dis(sg,10); while(T--){ for(int i = 0; i <= n ; i++) //这里要谨慎,少写一个等于号就wa,或者干脆全部都进行clear ma[i].clear(); memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&r); for(int i = 1 ; i < n; i++){ scanf("%d%d",&a,&b); ma[a].push_back(b); ma[b].push_back(a); } if(dfs(r)) puts("Gen"); else puts("Dui"); } return 0; }