Gym 101246DFire in the Country (dfs暴力博弈)

来源:互联网 发布:淘宝产品文案类型 编辑:程序博客网 时间:2024/06/07 00:35

题意:

给定一个无向有环图,大火从1点开始,每个时间点与它相邻的点也将会着火,现在有两个人轮流操作机器人,机器人从1点出发,每个人每次选择一个点走,谁最后被火烧了谁就输了。

题解:

预处理很重要,先bfs求出每个节点开始着火的时间,然后直接dfs暴力博弈。

代码:

#include<bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 1008;//下面注释的是用的dfs预处理求的天数超时了//dfs其实因该也行就是我写的很瓜皮,不想改了/*int f[MAXN], g[MAXN][MAXN];int n, m;void dfs1(int k, int val) {    for(int i = 1; i <= n; i++) {        if (g[k][i]) {            f[i] = min(val, f[i]);            g[k][i] = g[i][k] = 0;            dfs1(i, val+1);            g[k][i] = g[i][k] = 1;        }    }}int dfs2(int k, int day) {    for(int i = 1; i <= n; i++) {        if (f[i] == day && g[k][i])            if (!dfs2(i, day+1)) return 1;    }    return 0;}int main() {    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);    scanf("%d%d", &n, &m);    for(int i = 0; i < m; i++) {        int x, y;        scanf("%d%d", &x, &y);        g[x][y] = 1;        g[y][x] = 1;    }    for(int i = 1; i <= n; i++)        f[i] = MAXN;    dfs1(1, 1);    if (dfs2(1, 1)) puts("Vladimir");    else puts("Nikolay");    return 0;}*/int f[MAXN], g[MAXN][MAXN], nG[MAXN];int n, m;queue<int> q;void bfs() {//预处理求第i个节点着火的时间f[i]    while (!q.empty()) {        int k = q.front();        q.pop();        for(int i = 0; i < nG[k]; i++)        if (!f[g[k][i]]) {            f[g[k][i]] = f[k]+1;            q.push(g[k][i]);        }    }}//多组要用sg,这里只有一组直接暴力int dfs2(int k, int day) {    for(int i = 0; i < nG[k]; i++) {        if (f[g[k][i]] == day)            if (!dfs2(g[k][i], day+1)) return 1;//可以到必败点必胜    }    return 0;//不可以到必败点必败}int main() {    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);    scanf("%d%d", &n, &m);    for(int i = 0; i < m; i++) {        int x, y;        scanf("%d%d", &x, &y);        g[x][nG[x]++] = y;        g[y][nG[y]++] = x;    }    q.push(1);    f[1] = 1;    bfs();    if (dfs2(1, 2)) puts("Vladimir");    else puts("Nikolay");    return 0;}

原创粉丝点击