有向图博弈
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> par;
const int N=100010;
int n,m,cnt,G[N],du[N],idu[N],cc[N][2],drw[N][2],win[N][2];
struct iedge{
int t,nx;
}E[N<<1];
inline void addedge(int x,int y){
E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt;
}
queue<par> Q;
int main(){
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++)
scanf("%d%d",&x,&y),addedge(y,x),du[x]++,idu[x]++;
for(int i=1;i<=n;i++){
drw[i][0]=drw[i][1]=1;
if(!du[i])
drw[i][0]=drw[i][1]=0,Q.push(par(i,0)),Q.push(par(i,1));
}
while(!Q.empty()){
int u=Q.front().first,v=Q.front().second; Q.pop();
for(int i=G[u];i;i=E[i].nx)
if((v==0 && drw[E[i].t][1]) || (v==1 && !--idu[E[i].t]))
drw[E[i].t][v^1]=0,Q.push(par(E[i].t,v^1));
}
memset(win,-1,sizeof(win));
for(int i=1;i<=n;i++) cc[i][0]=cc[i][1]=du[i];
for(int x=1;x<=n;x++){
if(drw[x][0])for(int i=G[x];i;i=E[i].nx) cc[E[i].t][1]--;
if(drw[x][1])for(int i=G[x];i;i=E[i].nx) cc[E[i].t][0]--;
}
for(int i=1;i<=n;i++)
if(!du[i]) win[i][0]=win[i][1]=0,Q.push(par(i,0)),Q.push(par(i,1));
while(!Q.empty()){
int u=Q.front().first,v=Q.front().second; Q.pop();
for(int i=G[u];i;i=E[i].nx)
if(!drw[E[i].t][v^1]){
if(win[u][v]){
if(!--cc[E[i].t][v^1])
win[E[i].t][v^1]=0,Q.push(par(E[i].t,v^1));
}
else{
if(!~win[E[i].t][v^1])
win[E[i].t][v^1]=1,Q.push(par(E[i].t,v^1));
}
}
}
for(int i=1;i<=n;i++){
if(!~win[i][0]) win[i][0]=1;
if(!~win[i][1]) win[i][1]=0;
}
for(int d=0;d<2;d++,putchar('\n'))
for(int i=1;i<=n;i++) putchar(drw[i][d]?'D':(win[i][d]?'W':'L'));
return 0;
}