附网址:http://acm.uestc.edu.cn/#/problem/show/1328
这道题是数据结构题,据说是并查集,然而弱鸡的我强转图论用了2-set
对很明显可以拆开用2-set做这题,将是否是好人存下来,存下两种情况 eg:1说2是坏人 那么插进去的就是 (1,1,2,0)和(1,0,2,1)两种情况。(1表示好人,0表示坏人)
附代码(大白的版)
// 2-set by liucxy
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#define maxn 100005
using namespace std;
int N;
struct node{
int n;
vector<int> G[maxn * 2];
bool mark[maxn * 2];
int s[maxn * 2],c;
void init(int n)
{
this->n = n;
for (int i = 0; i < N * 2; i++) G[i].clear();
memset(mark, 0, sizeof(mark));
}
bool dfs(int x)
{
if (mark[x ^ 1]) return false;
if (mark[x]) return true;
mark[x] = true;
s[c++] = x;
for (int i = 0; i < G[x].size(); i++)
if (!dfs(G[x][i])) return false;
return true;
}
void add_clause(int x, int xval, int y, int yval)
{
x = x * 2 + xval;
y = y * 2 + yval;
G[x ^ 1].push_back(y);
G[y ^ 1].push_back(x);
}
bool solve()
{
for (int i = 0; i < N * 2; i += 2)
{
if (!mark[i] && !mark[i+1])
{
c = 0;
if (!dfs(i))
{
while(c > 0) mark[s[--c]] = false;
if (!dfs(i + 1)) return false;
}
}
}
return true;
}
} hehe;
int main()
{
scanf("%d",&N);
hehe.init(N);
for (int i = 0; i < N; i++)
{
int x, y;
scanf("%d%d", &x, &y);
if (y==1)
{
hehe.add_clause(i,1,x-1,0);hehe.add_clause(i,0,x-1,1);//插入过程;
}
else if (y==2)
{
hehe.add_clause(i,1,x-1,1);hehe.add_clause(i,0,x-1,0);//插入过程;
}
}
bool haha=hehe.solve();
if (haha) printf("Time to show my power\n");
else printf("One face meng bi\n");
return 0;
}