求确定身份的人的个数。
只能确定狼的身份,因为只能找到谁说了谎。但一个人是否是民,无法确定。
将人视作点,指认关系视作边,有狼边和民边两种边。
确定狼的方法只有两种:
1. 在一个仅由一条狼边组成的环中,狼边指向的那个点必定是狼。
2. 环外指认铁狼为民的也必定是狼。
所以用原图找环求情况1中的铁狼,反向建图找情况2中的狼。
#includeusing namespace std;typedef long long LL;const int maxn =1e5+5;const int INF =0x3f3f3f3f;struct Edge{ int v;bool w; };Edge G[maxn];vector rG[maxn];int pre[maxn],dfn;bool isw[maxn];queue Q;int res;void init(int N){ res=0; memset(pre,0,sizeof(pre)); memset(isw,0,sizeof(isw)); for(int i=1;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=0;i