100 #P1171. G60*【博弈SG】练习1:在图中求SG

G60*【博弈SG】练习1:在图中求SG

【题意】USACO 2006 January Gold

有一个 NN 个点的有向拓扑图,上面有 MM 个棋子,棋子放在一个点上, 一个点上可以放多个棋子。

每次可以选一个棋子沿着一条有向边走一步(走到相邻的点上)。最后无法走棋的人输。

先手赢输出“WIN”否则输出”LOSE“

【输入格式】

多组数据。每组描述如下:

输出第一行 N(1N1000)N (1 \le N \le 1000) 下来 NN 行,每行第一个会给一个数,表示第 i1i-1 个点的出度,下来描述每个点的后继节点。点的编号为 00 to N1N-1

下来多组询问,每个询问给出 MM 个棋子的位置。MM00 时表示该组测试数据结束。(注意不是 NN00

数据太大,注意C++要用scanf

【输出格式】

每个询问输出 "WIN" or "LOSE".

【样例输入】

4
2 1 2
0
1 3
0
1 0
2 0 2
0
4
1 1
1 2
0
0
2 0 1
2 1 1
3 0 1 3
0

【样例输出】

WIN
WIN
WIN
LOSE
WIN

【提示】

拓扑好序列,按照拓扑序列从后往前,没有后继的点的sg值先赋值为0(必败),有后继节点的点就用mex函数。 最后的总状态为所有点的sg值的和(异或和),如下图。