POJ 2599 A funny game

11 篇文章 0 订阅

题目: 给定一棵有N个节点双向边的树,从某个节点出发,两人轮流不重复地转移到另一个节点,无路可走的人输。

分析:树形博弈, N态的后继一定有P态,P态没有N后继态。 注意状态的转移。。。。。


代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1010;
int M[maxn][maxn],vis[maxn],L,N,K;

bool Win(int p){
	vis[p]=1;	
	for(int i=1;i<=N;i++)if(M[p][i]){
		if(!vis[i]){
			if(!Win(i)){
				vis[p]=0;
				L=i;
				return true;
			}
		}	
	}
	vis[p]=0;
	return 0;
}
int main(){
	//freopen("D:/程序/ACM/C-Free/in.txt","r",stdin);  freopen("D:/程序/ACM/C-Free/out.txt","w",stdout);
	while(~scanf("%d%d",&N,&K)){
		memset(M,0,sizeof(M));   memset(vis,0,sizeof(vis));
		int x,y;
		for(int i=1;i<N;i++){
			scanf("%d%d",&x,&y);
			M[x][y]=M[y][x]=1;
		}
		if(Win(K)) printf("First player wins flying to airport %d\n",L);
		else printf("First player loses\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值