传送门biu~
枚举一个议案通过或不通过是否能成立。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int head[2005],nex[8005],to[8005],tp;
bool b[2005];
char ans[1005];
void add(int x,int y){
nex[++tp]=head[x];
head[x]=tp;
to[tp]=y;
}
void dfs(int x){
b[x]=1;
for(int i=head[x];i;i=nex[i])
if(!b[to[i]]) dfs(to[i]);
}
inline bool check(int x){
memset(b,0,sizeof(b));
dfs(x);
for(int i=1;i<=n;++i) if(b[i<<1] && b[i<<1|1]) return false;
return true;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int a,b;char ai[2],bi[2];
scanf("%d%s%d%s",&a,ai,&b,bi);
a<<=1;b<<=1;
if(ai[0]=='N') a^=1;
if(bi[0]=='N') b^=1;
add(a^1,b); add(b^1,a);
}
for(int i=1;i<=n;++i){
bool case_1=check(i<<1);
bool case_2=check(i<<1|1);
if(case_1 && case_2) ans[i]='?';
else if(case_1) ans[i]='Y';
else if(case_2) ans[i]='N';
else{
printf("IMPOSSIBLE");
return 0;
}
}
for(int i=1;i<=n;++i) printf("%c",ans[i]);
return 0;
}