树的删边游戏。。

由于题目的特殊性,我们只需计算环的边数值。若为偶环,则直接把环的根节点置0。若为奇环,则留下一条边与根结点相连,并那它们的SG置0;

注意的是,两个点也可构成环,因为允许重边。所以,我们只需求点双连通分量,并判断分量中边的数量即可。然后DFS求树的SG值。

 #include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int N=;
const int M=;
int n,m;
struct {
int v,next;
}edge[M];
struct {
int u,v;
}edge_stack[M],tmp;
int dfn[N],low[N],index;
int edge_top,tot;
bool vis[N],vis_e[M];
int head[N],sg[N]; void addedge(int u,int v){
vis_e[tot]=false;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
} void tarjan(int u){
int i,j,k,v,e;
dfn[u]=low[u]=++index;
for(e=head[u];e!=-;e=edge[e].next){
v=edge[e].v;
if(dfn[v]==-){
vis_e[e]=vis_e[e^]=true;
edge_stack[++edge_top].u=u;
edge_stack[edge_top].v=v;
tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v]){
int cnt=;
do{
tmp.u=edge_stack[edge_top].u;
tmp.v=edge_stack[edge_top].v;
edge_top--;
cnt++;
vis[tmp.u]=vis[tmp.v]=true;
// printf("edge=%d %d ",tmp.u,tmp.v);
}while(!(tmp.u==u&&tmp.v==v));
// printf("\n");
if((cnt&)){
vis[tmp.u]=vis[tmp.v]=false;
}
else vis[tmp.u]=false;
}
}
else{
if(!vis_e[e]){
low[u]=min(low[u],dfn[v]);
if(dfn[u]>dfn[v]){
edge_stack[++edge_top].u=u;
edge_stack[edge_top].v=v;
}
}
}
}
} int dfs(int u){
int e,v;
vis[u]=true;
int ans=sg[u];
for(e=head[u];e!=-;e=edge[e].next){
int v=edge[e].v;
if(!vis[v]){
ans^=(dfs(v)+);
}
}
return ans;
} int main(){
int k,u,v;
while(scanf("%d",&k)!=EOF){
int ans=;
while(k--){
edge_top=-;
scanf("%d%d",&n,&m);
tot=index=;
for(int i=;i<=n;i++){
vis[i]=false; sg[i]=;
head[i]=dfn[i]=low[i]=-;
}
for(int i=;i<=m;i++){
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
tarjan();
ans^=dfs();
}
if(ans) printf("Sally\n");
else printf("Harry\n");
}
return ;
}

POJ 3710的更多相关文章

  1. POJ 3710 无向图简单环树上删边

    结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...

  2. POJ 3710 Christmas Game#经典图SG博弈

    http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...

  3. poj 3710 Christmas Game(树上的删边游戏)

    Christmas Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1967   Accepted: 613 Des ...

  4. poj 3710 Christmas Game 博弈论

    思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...

  5. POJ 3710 Christmas Game

    知识储备: 解决办法(奇偶去环):   (1) 对于长度为奇数的环,去掉其中任意一个边之后,剩下的 两个链长度同奇偶,抑或之后的 SG 值不可能为奇数,所 以它的 SG 值为 1: (2) 对于长度为 ...

  6. POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)

    题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...

  7. POJ 3710:Matrix Power Series

    Description 给出矩阵 \(n*n\) 的 矩阵\(A\) , 求 \(A^1+A^2+A^3...+A^k\) Solution 首先我们设 \(S_n=\sum_{i=1}^{n}A^i ...

  8. POJ 3710 Christmas Game [博弈]

    题意:略. 思路:这是个删边的博弈游戏. 关于删边游戏的预备知识:http://blog.csdn.net/acm_cxlove/article/details/7854532 学习完预备知识后,这一 ...

  9. poj 3710 Christmas Game【博弈论+SG】

    也就是转换到树形删边游戏,详见 https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html #include<iostream> ...

随机推荐

  1. thinkphp的ip地址定位

    在WEB应用中,根据IP地址定位和记录相关访问日志也是非常常见的需求,在ThinkPHP中你可以轻松的实现IP地址获取和定位. 获取扩展类库 可以在官网的http://www.thinkphp.cn/ ...

  2. hdu1429胜利大逃亡(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. 汇编程序10:计算长度为C字节的数据和

    assume cs:code code segment mov ax,0ffffh //起始段地址 mov ds,ax mov bx,0 //偏移变量 mov dx,0 //保存结果 mov cx,1 ...

  4. .net core2.0 自定义中间件

    一.中间件(Middleware) 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 二.编写SimpleMiddleware using Microsoft.AspNetCore.Htt ...

  5. python爬虫:爬取百度云盘资料,保存下载地址、链接标题、链接详情

    在网上看到的教程,但是我嫌弃那个教程写的乱(虽然最后显示我也没高明多少,哈哈),就随手写了一个 主要是嫌弃盘搜那些恶心的广告,这样直接下载下来,眼睛清爽多了. 用pyinstall 打包成EXE文件, ...

  6. 简单的UIButton按钮动画效果iOS源码

    这个是简单的UIButton按钮动画效果案例,源码,简单的UIButton按钮动画,可以自定义button属性. 效果图: <ignore_js_op> 使用方法: 使用时把ButtonA ...

  7. 红黑联盟 php相关资讯

    http://www.2cto.com/tag/phpbanben.html

  8. End to End Sequence Labeling via Bi-directional LSTM CNNs CRF

    来看看今日头条首席科学家的论文: End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF 使用LSTM方法进行序列标注,完成大规模标 ...

  9. 新浪某个tab 页模仿

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Ubuntu 更换阿里源

    查看新版本信息 lsb_release -c Ubuntu 12.04 (LTS)代号为precise. Ubuntu 14.04 (LTS)代号为trusty. Ubuntu 15.04 代号为vi ...