列表

详情


NC237141. A tree game

描述

Alice 和 Bob 想在一棵树上玩一个有趣的游戏。
给定是 N 个顶点上的树,顶点从 1N 编号。顶点 1 表示根。 有 N-1 条边。 玩家交替移动,Alice 先移动。 一个操作包括两个步骤。 在第一步中,玩家选择一条边并将其从树中删除。 在第二步中,他/她删除了所有不再与根连接的边和点。无法操作的玩家输了。
你可以假设 Alice 和 Bob 都玩得最好。

输入描述

第一行包含一个整数 T () 。
对于每组数据,第一行包含一个整数 N ()。
接着 N-1 行,每行包含两个整数 I, J (),表示 IJ 相连。保证是一棵树。
保证 N 的总和不超过

输出描述

对于每组数据,请输出获胜者的名字。

示例1

输入:

3
3
1 2
2 3
3
1 2
1 3 
10
6 2
4 3
8 4
9 5
8 6
2 7
5 8
1 9
6 10

输出:

Alice
Bob
Alice

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 145ms, 内存消耗: 7156K, 提交时间: 2023-05-07 23:47:04

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

const int mod=1e9+7,N=1e5+10;

int n,m,k;
int sg[N];
vector<int> e[N];

void dfs(int u,int fa)
{
    int res=0;
    for(auto v : e[u])
    {
        if(v==fa) continue;
        dfs(v,u);
        res^=(sg[v]+1);
    }
    sg[u]=res;
}
    

void solve()
{
    cin >> n;
    for(int i=1;i<=n;i++) e[i].clear();
    for(int i=1;i<n;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        e[a].push_back(b);
        e[b].push_back(a);
    }
    dfs(1,0);
    if(sg[1]) puts("Alice");
    else puts("Bob");
}

int main()
{
    int _;
    cin >> _;
    while(_--) solve();
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 284ms, 内存消耗: 7136K, 提交时间: 2022-08-14 17:03:15

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
vector<int> g[N];
int f[N];
int dfs(int x,int fa)
{
	if(f[x]!=-1) return f[x];
	f[x]=0;
	for(auto d:g[x])
	{
		if(d==fa) continue;
		f[x]^=(dfs(d,x)+1);
	}
	return f[x];
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++) g[i].clear();
		memset(f,-1,sizeof(f));
		for(int i=1;i<=n-1;i++)
		{
			int x,y;
			cin>>x>>y;
			g[x].push_back(y);
			g[y].push_back(x);
		}
		int fin=dfs(1,-1);
		if(fin) cout<<"Alice\n";
		else cout<<"Bob\n";
	}
}

上一题