#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 300003
int vis[maxn];
struct node
{
int sex, fa, de, DNA; // sex性别,fa父亲节点, de是不是死了;
}p[maxn];
int a[maxn];
int n, m, k;
int find(int x)
{
return p[x].fa == x ? x : p[x].fa = find(p[x].fa);
}
void merge(int x, int y)
{
int rx = find(x);
int ry = find(y);
if(rx != ry)
p[ry].fa = rx;
}
int main()
{
int i;
int x, y, len, sum;
char buf[555];
while( ~scanf("%d", &n))
{
for(i = 1; i <= maxn - 1; i++)
{
p[i].fa = i;
p[i].de = 0;
p[i].DNA = -1;
}
for(i = 1; i <= n; i++)
{
scanf("%s", buf);
if(buf[0] == 'M')
p[i].sex = 0;
else
p[i].sex = 1;
}
scanf("%d", &m);
getchar();
while(m--)
{
gets(buf);
len = strlen(buf);
if(buf[0] == '-')
{
sum = 0;
for(i = 1; i < len; i++)
sum = sum * 10 + buf[i] - '0';
p[sum].de = 1;
}
else if(buf[len-1] == 'F' || buf[len-1] == 'M')
{
i = 0; x = y = 0;
char c = buf[len-1];
while(buf[i] != ' ') x = x * 10 + buf[i] - '0', i++;
i++;
while(buf[i] != ' ') y = y * 10 + buf[i] - '0', i++;
if(c == 'F') p[++n].sex = 1;
else p[++n].sex = 0;
if(p[x].sex == 1)
merge(x, n);
else
merge(y, n);
}
}
scanf("%d", &k);
while(k--)
{
scanf("%d%d", &x, &y);
int rx = find(x);
p[rx].DNA = y;
}
int num = 0;
for(i = 1; i <= n; i++)
if(!p[i].de)
a[num++] = find(i);
sort(a, a + num);
num = unique(a, a + num) - a;
if(num == 1)
puts("YES");
else
{
int cnt = 0;
for(i = 0; i < num; i++)
if(p[a[i]].DNA == -1) cnt++;
if(cnt > 0)
{
int ans = -1;
for(i = 0; i < num; i++)
{
if(p[a[i]].DNA == -1) continue;
if(ans == -1) ans = p[a[i]].DNA;
else if(ans != p[a[i]].DNA) break;
}
if(i == num) puts("POSSIBLY");
else puts("NO");
}
else if(cnt == 0)
{
for(i = 1; i < num; i++)
if(p[a[0]].DNA != p[a[i]].DNA)
break;
if(i == num) puts("YES");
else puts("NO");
}
}
}
return 0;
}
POJ 4026 Eve 并查集模拟题
最新推荐文章于 2018-08-21 08:30:26 发布