博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVALive - 7042 The Problem to Make You Happy 博弈
阅读量:4935 次
发布时间:2019-06-11

本文共 2936 字,大约阅读时间需要 9 分钟。

题目大意:给你一个有向图, Bob 和 Alice 在做游戏,每轮他们走一步,当Bob 和 Alice在同一个点或者 Bob无路可走,Bob输,否则Alice输。

 

思路:因为在Bob赢的时候存在有环的情况, 但是在Bob输的时候的状态是明确的,我们利用Bob输的状态进行必胜比败态推演,

f[ i ][ j ][ k ] 表示Alice在i ,Bob在j 且轮到k走  Bob是必输还是必胜。

#include
#define LL long long#define fi first#define se second#define mk make_pair#define pii pair
#define y1 skldjfskldjg#define y2 skldfjsklejgusing namespace std;const int N = 100 + 7;const int M = 1e5 + 7;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const int mod = 1e9 +7;int n, m, B, A, deg[N], num[N][N][2];vector
edge[N], redge[N];int f[N][N][2], vis[N][N][2];struct node { node(int x, int y, int d) { this->x = x; this->y = y; this->d = d; } int x, y, d;};void init() { for(int i = 0; i < N; i++) { edge[i].clear(); redge[i].clear(); } memset(deg, 0, sizeof(deg)); memset(vis, 0, sizeof(vis)); memset(num, 0, sizeof(num)); for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) f[i][j][0] = f[i][j][1] = 1;}void bfs() { queue
que; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { for(int k = 0; k < 2; k++) { if(i == j) { f[i][j][k] = 0; que.push(node(i, j, k)); vis[i][j][k] = 1; } else if(k == 1) { if(!edge[j].size()) { f[i][j][k] = 0; que.push(node(i, j, k)); vis[i][j][k] = 1; } } } } } while(!que.empty()) { node cur = que.front(); que.pop(); if(!cur.d) { for(int i = 0; i < redge[cur.y].size(); i++) { int nxy = redge[cur.y][i]; if(vis[cur.x][nxy][1]) continue; num[cur.x][nxy][1]++; if(num[cur.x][nxy][1] == deg[nxy]) { f[cur.x][nxy][1] = 0; vis[cur.x][nxy][1] = 1; que.push(node(cur.x, nxy, 1)); } } } else { for(int i = 0; i < redge[cur.x].size(); i++) { int nxx = redge[cur.x][i]; if(vis[nxx][cur.y][0]) continue; f[nxx][cur.y][0] = 0; vis[nxx][cur.y][0] = 1; que.push(node(nxx, cur.y, 0)); } } }}int main() { int T; scanf("%d", &T); for(int cas = 1; cas <= T; cas++) { init(); scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); edge[u].push_back(v); redge[v].push_back(u); deg[u]++; } scanf("%d%d", &B, &A); bfs(); printf("Case #%d: ", cas); printf("%s\n", f[A][B][1] ? "Yes" : "No"); } return 0;}/**/

 

转载于:https://www.cnblogs.com/CJLHY/p/9328147.html

你可能感兴趣的文章
验证邮箱合法性的一些测试样例
查看>>
Python安装第三方库 xlrd 和 xlwt 。处理Excel表格
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
查看>>
细说sqlserver索引及SQL性能优化原则
查看>>
一般数据库增量数据处理和数据仓库增量数据处理的几种策略
查看>>
离散数学课后作业
查看>>
centos6.5适用的国内yum源:网易、搜狐
查看>>
[winograd]winograd算法在卷积中的应用
查看>>
视频直播技术(三):低延时直播经验总结
查看>>
微软Office Online服务安装部署(一)
查看>>
Application failed to start because it could not find or load the QT platform plugin “windows”
查看>>
python合并多表或两表数据
查看>>
分享一下伪装刚学的
查看>>
androif MVC
查看>>
从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
查看>>
JSP相关知识
查看>>
你真的需要一个jQuery插件吗
查看>>
js面试题知识点全解(一闭包)
查看>>
MVC接口式开发 封装统一请求方法
查看>>