Portal --> Nowcoder197D

Solution

  所以说这是一道==纯粹的人类智慧题是这样吗qwq

​  一开始的时候想sg函数qwq然后发现。。好像根本不能拆成独立的子游戏嘛qwq

  

  换一个角度来思考:首先考虑一下这个图的性质

  因为这是一个简单无向图,然后除了起点和终点以外没有度数\(>2\)的点,也就是说不可能出现走到一个点之后出现分叉路这样的情况,更加具体一点就是:这个图中从\(1\)到\(n\)的路径都是互不相交的

  注意到因为每次操作都是\(-1\),所以不管怎么操作一定能够得到一个这样的局面:只剩下一条从\(1\)到\(n\)的路径,并且这条路径上的每条边的边权都是\(1\),因为必须要进行一次操作,所以碰上这种局面的那个人必败

  这个时候我们就可以得到一个比较直接的策略了:两个人都要尽可能地避免自己碰上种局面(为了方便表述,后面将这种只剩一条全\(1\)路的局面称为“结束局面”),也就是说,要尽早将自己会遇上的可能成为这种局面的\(1\)到\(n\)的路径断掉,断掉一条\(1\)到\(n\) 路径的最少操作次数为这条路径上的边权最小值,所以我们要做的就是,找出每条从\(1\)到\(n\)的路径,判断如果最后剩下的那条全是\(1\)的路是这条的话,会是谁要进行操作(也就是判断这条路径对谁来说必败),然后将断掉这条路径所需的的最少次数加到对应的那个人的统计变量中,最后只要判断一下两个统计变量的大小,就可以知道是谁先破坏完自己的必败路径了(也就是对方的必胜路径),先破坏完的那个人就是有必胜策略的

  最后的问题就是如何判断一条路径对谁来说必败:注意到一个比较明显但是又很容易忽略的性质(比如说我就忽略了==),因为每次操作的时候都是\(-1\),所以先手操作完之后剩余边权之和与原边权和的奇偶性是不同的,后手操作完之后则一定是相同的,如果说一条路径是“结束局面”中剩的那条路径,那么这条路径包含的边的数量就是该局面的边权之和(因为根据定义结束局面中所有的边权都是\(1\)),所以我们可以直接通过这个以及一开始还没有进行任何操作时总的边权和的奇偶性来判断,如果奇偶性相同说明会是后手碰上,否则是先手碰上

  然后因为这题对图的约束,边数什么的不会很多,\(1\)到\(n\)的路径总数也不会很多,所以我们直接爆搜一下统计一下就好了

  

  mark:尝试从奇偶性的角度分析问题的时候。。不妨想一下剩余局面,比如说这题就是:先手操作完之后剩余边权之和与原边权和的奇偶性是不同的,后手操作完之后则一定是相同的

  

  

​  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+10,inf=2147483647;
struct xxx{
int y,nxt,dis;
}a[N*2];
int h[N];
ll cnt[2];
int n,m,tot;
ll sum;
void add(int x,int y,int d){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot; a[tot].dis=d;}
void dfs(int pre,int x,int who,int mn){
int u;
if (x==n){
cnt[who]+=mn; return;
}
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (i==(pre^1)) continue;
dfs(i,u,who^1,min(mn,a[i].dis));
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y,z;
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
tot=1; sum=0;
for (int i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
sum+=z;
}
dfs(0,1,0,inf);
--sum;
if (cnt[sum&1]>cnt[sum&1^1]) printf("Yes\n");
else printf("No\n");
}

最新文章

  1. 第三方登录插件.NET版XY.OAuth-CSharp
  2. 转:使用DBUnit测试时违反外键约束的解决办法
  3. PHP simplexml_load_string 过滤&lt;![CDATA[XXXX]]&gt;
  4. Unity3D ShaderLab 透明裁剪着色器
  5. Asp.Net 之 通过调用 WScript.Shell 启动本地 exe 程序时产生“ automation服务器不能创建对象 ”的错误
  6. TreeView递归取值
  7. PHP文章关键词相似短尾长尾内链替换方法介绍
  8. Linux sed命令常用方法
  9. 【C++基础之十五】内联函数
  10. [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
  11. Python学习笔记(三)Python的list和tuple
  12. Windows 2008 配置ASP+ACCESS环境(亲身体会)
  13. centos 7安装源
  14. RabbitMQ系列教程之二:工作队列(Work Queues)
  15. ABP+AdminLTE+Bootstrap Table权限管理系统第一节--使用ASP.NET Boilerplate模板创建解决方案
  16. 浅析Numpy.genfromtxt及File I/O讲解
  17. Spring Security入门(3-2)Spring Security对接用户的权限系统
  18. Problem B: Battle Royale(简单几何)
  19. fiddler启用过滤规则只显示想要的接口数据
  20. Spark提高篇——RDD/DataSet/DataFrame(二)

热门文章

  1. 使用Python的Requests库进行web接口测试
  2. shell 判断日期间隔及润年
  3. Linux内核学习笔记(2)-- 父进程和子进程及它们的访问方法
  4. oracle查询数据库所有用户信息
  5. node项目设置环境变量
  6. 用 Python 编写的 Python 解释器
  7. socket发送文字、图片、文件---基于python实现
  8. Walking Between Houses(贪心+思维)
  9. zigbee,质量追溯系统,上位机,mis系统,C#(一)
  10. DL开源框架Caffe | 模型微调 (finetune)的场景、问题、技巧以及解决方案