博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARC078 D.Fennec VS. Snuke(树上博弈)
阅读量:7045 次
发布时间:2019-06-28

本文共 1047 字,大约阅读时间需要 3 分钟。

题目大意:

给定一棵n个结点的树

一开始黑方占据1号结点,白方占据n号结点

其他结点都没有颜色

每次黑方可以选择黑色结点临近的未染色结点,染成黑色

白方同理。

最后谁不能走谁输。

 

题解:

其实简单想想就可以想明白。

黑方肯定要往通往白方的最短路延伸,白方也是这样。

因为这样每次你可以最大化可行动次数。

所以先以1为根,dfs一遍,然后找到路径。

模拟一下走路径的过程,路径走光了就比谁的可行动次数多(有点像围棋的气的感觉),输出结果就可以了

 

#include 
#include
#include
#include
using namespace std;const int maxn = 1e5 + 100;vector
G[maxn];int deep[maxn], sz[maxn], f[maxn];deque
Q;void dfs(int x, int fa, int d){ deep[x] = d; sz[x] = 1; f[x] = fa; for(auto to : G[x]){ if(to == fa) continue; dfs(to, x, d+1); sz[x] += sz[to]; }}int main(){ int n, x, y; cin>>n; for(int i = 1; i < n; i++){ scanf("%d %d", &x, &y); G[x].push_back(y); G[y].push_back(x); } dfs(1, 1, 1); x = n; while(x != 1){ Q.push_back(x); x = f[x]; } Q.push_back(1); int ansB = 0, ansW = 0, B = 0, W, temp; while(1){ if(Q.empty()){ ansB += sz[B]-1-sz[W]; ansW = sz[W] - ansW; if(ansB <= ansW) cout<<"Snuke"<

 

转载于:https://www.cnblogs.com/Saurus/p/7257537.html

你可能感兴趣的文章
杭电 1018 Big Number
查看>>
SQL Server的差异备份还原
查看>>
本地仓库settings.xml中使用阿里的仓库
查看>>
JsonConvert 使用注意事项之 Serializable
查看>>
Linux系统套接字编程中存在的五个隐患
查看>>
Write-Ahead Transaction Log
查看>>
原博客已废弃
查看>>
项目中用到的一些思想
查看>>
#斐波那契数列用矩阵快速幂求解f(n)#
查看>>
(转载)linux那点事儿(上)
查看>>
java面试笔试谈
查看>>
Git提交出现错误1
查看>>
Linux动态链接库的使用
查看>>
挣值、预测
查看>>
push,后台推送代码实例
查看>>
关于Filter
查看>>
unity渲染层级关系小结
查看>>
Beta冲刺随笔集
查看>>
Oracle:rownum查询n条数据
查看>>
Linux--------------安装vim
查看>>