首页 > 代码库 > UVA 11927 - Games Are Important(sg函数)
UVA 11927 - Games Are Important(sg函数)
UVA 11927 - Games Are Important
题目链接
题意:给定一个有向图,结点上有一些石头,两人轮流移动石头,看最后谁不能移动就输了,问先手还后手赢
思路:求出每个结点的sg函数,然后偶数个石头结点可以不用考虑,因为对于偶数情况,总步数肯定能保证是偶数,所以只要考虑奇数情况的结点
代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <vector> using namespace std; const int N = 1005; int n, m, sg[N]; vector<int> g[N]; int dfs(int u) { if (sg[u] != -1) return sg[u]; if (g[u].size() == 0) return sg[u] = 0; bool vis[N]; memset(vis, false, sizeof(vis)); for (int i = 0; i < g[u].size(); i++) vis[dfs(g[u][i])] = true; for (int i = 0; ; i++) if (!vis[i]) return sg[u] = i; } int main() { while (~scanf("%d%d", &n, &m) && n || m) { int u, v; memset(g, 0, sizeof(g)); memset(sg, -1, sizeof(sg)); while (m--) { scanf("%d%d", &u, &v); g[u].push_back(v); } for (int i = 0; i < n; i++) dfs(i); int ans = 0, num; for (int i = 0; i < n; i++) { scanf("%d", &num); if (num&1) ans ^= sg[i]; } printf("%s\n", ans == 0? "Second":"First"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。