HDU6370 Werewolf 【基环内向树】
HDU6370 Werewolf
题意:
有\(N\)个人玩狼人杀,只有村民和狼人,每个人指定另一个人并指出一个身份,其中:村民是不会说谎的,狼人是有可能说谎的,问在所有情况下必然是狼人的人数和必然是村民的人数分别有多少
题解:
首先所有人都有可能说谎,所以不可能有人必然是村民
接下来我们考虑是否有人必然是狼人,我们考虑反推,即假设某个人是村民,是否产生矛盾
首先建图,每个人向其指定的那个人连边,如果指定为狼人,边权是\(1\),否则边权是\(0\)
可以发现,对于每一块联通块,都是一棵基环内向树,首先我们考虑环中是否有人必然是狼人
显然如果环的权值是\(1\)的情况下才有可能必定存在狼人,在这个情况下,唯一被指定是狼人的那个人必定只能是狼人
然后考虑不在环上的人,如果指定了环上的狼人为村民的话,这也必然是狼人,而且这是有传递性的,也就是如果当前人指定一个狼人是村民,那么指向这个人的人,如果也指定是村民,那那个人也是狼人,直到有人指定其父节点是狼为止
view code
//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
const int MAXN = 1e5+7;
int n, to[MAXN], w[MAXN], bel[MAXN];
bool vis[MAXN];
vector<int> G[MAXN];
vector<int> pt[MAXN];
void mark(int u, int id){
bel[u] = id;
pt[id].push_back(u);
for(int v : G[u]) if(!bel[v]) mark(v,id);
}
void dfs(int u, int &__count){
vis[u] = true;
for(int v : G[u]){
if(vis[v] or w[v]) continue;
__count++;
dfs(v,__count);
}
}
int rua(int id){
vector<int> vec;
stack<int> stk;
int u = pt[id][0];
while(true){
stk.push(u);
vis[u] = true;
if(vis[to[u]]){
int tp;
do{
vec.push_back(tp=stk.top());
stk.pop();
}while(tp!=to[u]);
break;
}
u = to[u];
}
int __count = 0;
for(int x : vec) __count += w[x];
if(__count!=1) return 0;
for(int x : vec) if(w[x]){
u = to[x];
break;
}
for(int x : pt[id]) vis[x] = false;
for(int x : vec) vis[x] = true;
dfs(u,__count);
return __count;
}
void solve(){
static char buf[20];
scanf("%d",&n);
for(int i = 1; i <= n; i++) G[i].clear();
for(int i = 1; i <= n; i++){
scanf("%d %s",&to[i],buf);
w[i] = buf[0]=='w'?1:0;
G[i].push_back(to[i]);
G[to[i]].push_back(i);
}
memset(bel+1,0,4*n);
memset(vis+1,0,n);
int ID = 0;
for(int i = 1; i <= n; i++){
if(!bel[i]){
++ID;
pt[ID].clear();
mark(i,ID);
}
}
int __count = 0;
for(int i = 1; i <= ID; i++) __count += rua(i);
printf("%d %d\n",0,__count);
}
int main(){
int tt;
for(scanf("%d",&tt); tt; tt--) solve();
return 0;
}
HDU6370 Werewolf 【基环内向树】的更多相关文章
- 【LCT维护基环内向树森林】BZOJ4764 弹飞大爷
4764: 弹飞大爷 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 101 Solved: 52[Submit][Status][Discuss] ...
- 牛客多校第二场B discount 基环内向树
题意: 有n种商品,每种商品有一个价格 p[i] . 每种商品都有2种打折方式: 1. 给你优惠 d[i] 元. 2. 免费送你第 f[i] 种饮料. 现在求每种饮料至少一瓶的最小花费. dp[i][ ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
- [bzoj] 1040 骑士 || 基环外向树dp
原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- BZOJ1040 骑士 基环外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6421 Solved: 2544[Submit][Status ...
- bzoj1040 内向树DP
2013-11-17 08:52 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1040 N个骑士,每个人有一个仇人,那么,每个骑士只有一个 ...
- 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)
点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...
随机推荐
- Python解释器和IPython
目录 简介 Python解释器 IPython 魔法函数 运行和编辑 Debug History 运行系统命令 简介 今天给大家介绍一下Python的一个功能非常强大的解释器IPython.虽然Pyt ...
- 【剑指 Offer】09.用两个栈实现队列
题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...
- nginx日志详细说明
Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的. 访问日志 访问日志主要记录 ...
- 【Linux】postfix大坑笔记
由于需要,想弄一个自动发送邮件的mailx或者sendmail 但是执行 echo "test" | mail -s "Worning mail !" xxxx ...
- ctfhub技能树—信息泄露—git泄露—Stash
打开靶机环境 查看页面内容 使用dirsearch进行扫描 使用Githack工具处理git泄露情况 进入.git/refs目录 发现stash文件,使用notepad++打开文件 使用git dif ...
- Windows10下Canvas对象获得屏幕坐标不正确的原因排查与处理
因为Canvas没有直接将画布内容保存为图片的方法,所以很多时候是通过获得Canvas画布的坐标,然后通过截图的方式来将画布内容保存为本地图片. 如何取得Canvas画布的坐标呢,比较简单实用的方式如 ...
- LuoguP5748 集合划分计数
题意 一个有\(n\)个元素的集合,将其分为任意个非空子集,求方案数.集合之间是无序的,\(\{\{1,2\},\{3\}\}=\{\{3\},\{1,2\}\}\). 设\(f_n\)表示用\(n\ ...
- Java多线程基础知识笔记(持续更新)
多线程基础知识笔记 一.线程 1.基本概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process):是程序的一次执行过程,或是 ...
- Python Debug工具
最近在github上冒出了一个python的debug神器PySnooper,号称在debug时可以消灭print.那么该工具有哪些优点呢,如何使用该工具呢.本文就介绍该工具的优缺点和使用方式. 前言 ...
- NIO非阻塞网络编程原理
NIO非阻塞网络编程原理 1.NIO基本介绍 Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API.从 JDK1.4 开始,Java 提供了一系列改进的 输 ...