题目来源:
http://acm.hdu.edu.cn/showproblem.php?pid=1524
分析:
1:每个节点,都限制了步长。故我们设置二维向量, vector<int> v[Max_N]
2: 每个节点可走的步长 已知。 同一般的 SG函数。
代码如下:
const int Max_N = 1005; int sg[Max_N]; vector<int>v[Max_N]; //注意 f数组要按从小到大排序 //SG函数要初始化为-1 对于每个集合只需初始化1遍 //n是集合f的大小 f[i]是定义的特殊取法规则的数组 int SG_dfs(int x) // x表示节点x { int i; if(sg[x]!=-1) return sg[x]; if(v[x].size() == 0) return 0; int vis[Max_N]; memset(vis,0,sizeof(vis)); for(i=0;i<v[x].size();i++) { sg[v[x][i] ]=SG_dfs(v[x][i]); vis[sg[v[x][i]]]=1; } for(i=0;;i++) if(vis[i] ==0 ) return i; } int main(){ int n,m,num,tmp; while(scanf("%d",&n) != EOF){ memset(sg,-1,sizeof(sg)); // 每次初始化一次即可 for(int i=0; i<n; i++){ v[i].clear(); scanf("%d",&num); for(int j=0; j<num; j++){ scanf("%d",&tmp); v[i].push_back(tmp); } } int u,res; while(scanf("%d",&m) && m){ res = 0 ; while(m--){ scanf("%d",&u); if(sg[u] == -1) sg[u] = SG_dfs(u); res^=sg[u]; } if(res == 0) puts("LOSE"); else puts("WIN"); } } return 0; }