求确定身份的人的个数。

只能确定狼的身份,因为只能找到谁说了谎。但一个人是否是民,无法确定。

将人视作点,指认关系视作边,有狼边和民边两种边。

确定狼的方法只有两种:

  1. 在一个仅由一条狼边组成的环中,狼边指向的那个点必定是狼。

  2. 环外指认铁狼为民的也必定是狼。

所以用原图找环求情况1中的铁狼,反向建图找情况2中的狼。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn =1e5+;
const int INF =0x3f3f3f3f;
struct Edge{
int v;bool w;
};
Edge G[maxn];
vector<Edge> rG[maxn];
int pre[maxn],dfn;
bool isw[maxn];
queue<int> Q;
int res; void init(int N){
res=;
memset(pre,,sizeof(pre));
memset(isw,,sizeof(isw));
for(int i=;i<=N;++i) rG[i].clear();
} void AddEdge(int u,int v,bool w){
G[u] = (Edge){v,w};
rG[v].push_back((Edge){u,w});
} void BFS()
{
while(!Q.empty()){
int u = Q.front();Q.pop();
for(int i=;i<rG[u].size();++i){
Edge &e =rG[u][i];
if(!e.w && !isw[e.v]){
Q.push(e.v);
isw[e.v] = true;
}
}
}
} void Tarjan(int u){
int v;bool w;
pre[u]=;
v= G[u].v;
w = G[u].w;
if(!pre[v])
Tarjan(v);
else if(pre[v]==){ //找到环
int cnt=, tar,t;
for(t=v;;t= G[t].v){
Edge &e = G[t];
if(e.w){
cnt++;
tar = G[t].v;
}
if(e.v==v) break;
}
if(cnt==){ //只有一个狼边才行
isw[tar] = true;
Q.push(tar);
}
}
pre[u]=;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("1009.out","w",stdout);
#endif
int T,N,u,v,tmp;
char op[];
scanf("%d",&T);
while(T--){
scanf("%d",&N);
init(N);
for(int u=;u<=N;++u){
scanf("%d %s",&v,op);
if(op[]=='w') AddEdge(u,v,);
else AddEdge(u,v,);
} for(int i =;i<=N;++i){
if(!pre[i])
Tarjan(i);
}
BFS();
for(int i=;i<=N;++i)
if(isw[i]) res++;
printf("%d %d\n",,res);
}
return ;
}

HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)的更多相关文章

  1. HDU 6370 Werewolf 【并查集】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6370 Werewolf Time Limit: 2000/1000 MS (Java/Others)   ...

  2. hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...

  3. HDU 6143 - Killer Names | 2017 Multi-University Training Contest 8

    /* HDU 6143 - Killer Names [ DP ] | 2017 Multi-University Training Contest 8 题意: m个字母组成两个长为n的序列,两序列中 ...

  4. HDU 6074 - Phone Call | 2017 Multi-University Training Contest 4

    看标程的代码这么短,看我的.... 难道是静态LCA模板太长了? /* HDU 6074 - Phone Call [ LCA,并查集 ] | 2017 Multi-University Traini ...

  5. HDU 6068 - Classic Quotation | 2017 Multi-University Training Contest 4

    /* HDU 6068 - Classic Quotation [ KMP,DP ] | 2017 Multi-University Training Contest 4 题意: 给出两个字符串 S[ ...

  6. HDU 6076 - Security Check | 2017 Multi-University Training Contest 4

    /* HDU 6076 - Security Check [ DP,二分 ] | 2017 Multi-University Training Contest 4 题意: 给出两个检票序列 A[N], ...

  7. HDU 6071 - Lazy Running | 2017 Multi-University Training Contest 4

    /* HDU 6071 - Lazy Running [ 建模,最短路 ] | 2017 Multi-University Training Contest 4 题意: 四个点的环,给定相邻两点距离, ...

  8. HDU 6078 - Wavel Sequence | 2017 Multi-University Training Contest 4

    /* HDU 6078 - Wavel Sequence [ DP ] | 2017 Multi-University Training Contest 4 题意: 给定 a[N], b[M] 要求满 ...

  9. HDU 6070 - Dirt Ratio | 2017 Multi-University Training Contest 4

    比赛时会错题意+不知道怎么线段树维护分数- - 思路来自题解 /* HDU 6070 - Dirt Ratio [ 二分,线段树 ] | 2017 Multi-University Training ...

随机推荐

  1. pl/sql 实例精解 07

    这章主要讨论 oracle11g 新特性, continue, continue when 语句 continue 的作用同其他编程语言一样. continue when condition 只是当条 ...

  2. 从头认识java-17.4 具体解释同步(2)-具体解释竞争条件

    这一章节我们来具体讨论一下竞争条件. 1.为什么会引起竞争条件? 因为操作缺失原子性. 2.什么是原子性? 所谓原子操作是指不会被线程调度机制打断的操作:这样的操作一旦開始,就一直运行到结束.中间不会 ...

  3. 用n(0)次求一个数组里面最大子数组的和(数组可以输入负数)

    今天老师布置了题目上的任务,可谓是杀死人脑细胞不偿命呐... 在课上叽叽咕咕的讨论了一节课也没有答案,只得出几个备选方案,一个是通过枚举法将数组里面的子数组和一个个列出来然后在进行比较,可想而知(n2 ...

  4. Android中的ACCESS_MOCK_LOCATION权限使用Demo

    转载地址:http://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/ The DDMS t ...

  5. SurvivalShooter学习笔记(八.敌人管理器)

    敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour { public PlayerHea ...

  6. Setting up PhoneGap on Ubuntu for Android app development

    This is just some notes I made, mostly taken from http://docs.phonegap.com/en/3.0.0/guide_overview_i ...

  7. c itoa和atoi

    #include <iostream> using namespace std; int main() { #if 1 ; ];//不要写成char*,因为没有分配空间 itoa(num, ...

  8. Sublime text 3 快捷键:

    Ctrl+Shift+[  选中代码,按下快捷键,折叠代码. Ctrl+Shift+]  选中代码,按下快捷键,展开代码.  Ctrl+Shift+P:打开命令面板 Ctrl+P:打开搜索框,搜索项目 ...

  9. A1231. Crash的数字表格(贾志鹏)

    A1231. Crash的数字表格(贾志鹏) 时间限制:2.0s   内存限制:512.0MB   总提交次数:410   AC次数:154   平均分:63.93   将本题分享到:        ...

  10. Less-@import 导入选项

    //@import 导入选项 --@import 可以至于任何你需要导入的地方 在标准的CSS,@import在规则必须先于所有其他类型的规则.但Less.js不关心 example: .test() ...