设为首页 加入收藏

TOP

sgu - 520 - Fire in the Country
2014-11-23 19:26:03 来源: 作者: 【 】 浏览:8
Tags:sgu 520 Fire the Country

题意:n个点m条边的无向连通图,开始时结点1起火,火蔓延到其相邻点需1天,开始时有个机器人也在结点1处,但机器人先走了,结点1才起火,Vladimir与Nikolay轮流控制这个机器人,机器人1天也只能移动到另一个相邻点,最后谁不得不让机器人走向火海谁就败,输出胜者。

——>>搜索中的博弈,策略:让火跟着走,走进死胡同,下一天对手就没得走了(若子状态有一个先手必败状态,那么现在这个状态是先手必胜状态)。

f[i]表示火蔓延到结点i要多少天。

#include 
#include 
#include 

using namespace std;

const int maxn = 1000 + 10;
int n, m, head[maxn], nxt[maxn<<1], u[maxn<<1], v[maxn<<1], ecnt, f[maxn];

void init(){
    for(int i = 1; i <= n; i++) head[i] = -1;
    ecnt = 0;
}

void addEdge(int uu, int vv){
    u[ecnt] = uu;
    v[ecnt] = vv;
    nxt[ecnt] = head[uu];
    head[uu] = ecnt;
    ecnt++;
}

void read(){
    int i, uu, vv;
    for(i = 0; i < m; i++){
        scanf("%d%d", &uu, &vv);
        addEdge(uu, vv);
        addEdge(vv, uu);
    }
}

void bfs(){
    queue qu;
    while(!qu.empty()) qu.pop();
    f[1] = 1;
    qu.push(1);
    while(!qu.empty()){
        int u = qu.front(); qu.pop();
        for(int e = head[u]; e != -1; e = nxt[e]) if(!f[v[e]]){
            f[v[e]] = f[u] + 1;
            qu.push(v[e]);
        }
    }
}

void fire(){
    memset(f, 0, sizeof(f));
    bfs();
}

bool dfs(int u){
    for(int e = head[u]; e != -1; e = nxt[e]) if(f[v[e]] == f[u] + 1 && !dfs(v[e])) return 1;
    return 0;
}

int main()
{
    while(scanf("%d%d", &n, &m) == 2){
        init();
        read();
        fire();
        if(dfs(1)) printf("Vladimir\n");
        else printf("Nikolay\n");
    }
    return 0;
}

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 1016 Prime Ring Problem (DF.. 下一篇hdu1753I Hate It(线段树)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)
·MySQL下载与安装教程 (2025-12-26 13:21:26)
·Linux_百度百科 (2025-12-26 12:51:52)
·Shell 流程控制 | 菜 (2025-12-26 12:51:49)