AtCoder Grand Contest 005 E - Sugigma: The Showdown 博弈论+贪心
2018-02-14 09:52
711 查看
题意
给出一个无向图,边分为红边和蓝边,其中红边和蓝边分别构成一棵树。现在两个人各在树上一个点。每人轮流操作,每次可以不走或走到一个与当前点有边相连的点。其中先手只能走红边,后手只能走蓝边。若某刻两个人位于同一个点,游戏结束。先手要最大化操作次数,后手要最小化操作次数。问最终的操作次数是多少。n<=200000
分析
首先要知道怎么判-1。先把蓝边树建出来,对于某条红边(x,y),若在蓝树上x到y路径长度大于2,且在先手走到x或y上时后手还未抓到先手,则为-1。
那么我们把长度大于2的边删掉,剩下的就只能是1或2。
不难发现只走长度为1或2的边是不可能走出蓝树的子树的。
那么先手的最优策略就是走到一个能走到的深度最大的点,然后弃疗。
这样就可以做了。
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int N=200005; int n,cnt,last ,fa ,dep ,dis ,q ,dfn ,mx ,tim,a [2],sx,sy; bool vis ,win ; struct edge{int to,next,col;}e[N*4]; int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void addedge(int u,int v,int col) { e[++cnt].to=v;e[cnt].col=col;e[cnt].next=last[u];last[u]=cnt; e[++cnt].to=u;e[cnt].col=col;e[cnt].next=last[v];last[v]=cnt; } void dfs(int x) { dep[x]=dep[fa[x]]+1;dfn[x]=++tim; for (int i=last[x];i;i=e[i].next) if (e[i].to!=fa[x]) fa[e[i].to]=x,dfs(e[i].to); mx[x]=++tim; } bool check(int x,int y) { if (dfn[x]>dfn[y]) swap(x,y); if (dfn[x]<dfn[y]&&mx[x]>dfn[y]) return dep[y]-dep[x]>2; if (fa[x]==fa[y]) return 0; return 1; } void bfs() { int h=1,t=1;q[1]=sx;vis[sx]=1; while (h<=t) { int x=q[h++]; for (int i=last[x];i;i=e[i].next) if (!e[i].col&&!vis[e[i].to]) { dis[e[i].to]=dis[x]+1; if (dis[e[i].to]<dep[e[i].to]) vis[e[i].to]=1,q[++t]=e[i].to; } } } int main() { n=read();sx=read();sy=read(); for (int i=1;i<n;i++) a[i][0]=read(),a[i][1]=read(); for (int i=1;i<n;i++) { int x=read(),y=read(); addedge(x,y,1); } dep[0]=-1;dfs(sy); for (int i=1;i<n;i++) { if (check(a[i][0],a[i][1])) win[a[i][0]]=win[a[i][1]]=1; else addedge(a[i][0],a[i][1],0); } bfs(); for (int i=1;i<=n;i++) if (win[i]&&vis[i]) {puts("-1");return 0;} int ans=0; for (int i=1;i<=n;i++) if (vis[i]) ans=max(ans,dep[i]*2); printf("%d",ans); return 0; }
相关文章推荐
- AtCoder Grand Contest 020 B - Ice Rink Game(贪心+计算机乘法)
- 【贪心+堆】AtCoder Grand Contest(018)C[Coins]题解
- AtCoder Grand Contest 010 F - Tree Game 博弈论
- AtCoder Grand Contest 020 B - Ice Rink Game(贪心+计算机乘法)
- AtCoder Grand Contest 020 B - Ice Rink Game(贪心+计算机乘法)
- AtCoder Grand Contest 003 D - Anticube 贪心
- AtCoder Grand Contest 004 D - Teleporter 贪心
- AtCoder Grand Contest 020 B - Ice Rink Game(贪心+计算机乘法)
- AtCoder Grand Contest 012 A - AtCoder Group Contest(贪心)
- AtCoder Grand Contest 004 F - Namori 贪心+构造
- AtCoder Grand Contest 005 C - Tree Restoring 构造
- AtCoder Grand Contest 011 A\B 贪心、二分
- AtCoder Grand Contest 016 E - Poor Turkeys 贪心
- AtCoder Grand Contest 010 D - Decrementing 博弈论
- 【Atcoder Grand Contest 010】D - Decrementing——博弈论
- AtCoder Grand Contest 005【A栈模拟,B单调栈】
- AtCoder Grand Contest 019 C - Fountain Walk 贪心+dp
- AtCoder Grand Contest 005 D - ~K Perm Counting 容斥原理+dp
- 【Atcoder Grand Contest 004】D - Teleporter——拓扑排序+贪心
- AtCoder Grand Contest 014 D - Black and White Tree 博弈论