思路:
必胜状态:存在一个后继是必败状态
由dp[u][v][c] -> dp[v][x][e.c],意思是A走一步后,轮到B走,相当于先手在B
记忆化搜索实现即可
必胜状态:存在一个后继是必败状态
由dp[u][v][c] -> dp[v][x][e.c],意思是A走一步后,轮到B走,相当于先手在B
记忆化搜索实现即可
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 105;
struct Edge {
int to, w;
Edge(int to = 0, int w = 0) : to(to), w(w) { }
};
vector<Edge> vec[maxn];
bool dp[maxn][maxn][26];
bool vis[maxn][maxn][26];
bool solve(int u, int v, int c) {
if(vis[u][v][c]) return dp[u][v][c];
vis[u][v][c] = true;
bool &ret = dp[u][v][c];
ret = false;
for(int i = 0; i < vec[u].size(); ++i) {
Edge e = vec[u][i];
if(e.w >= c)
ret |= !solve(v, e.to, e.w);
}
return ret;
}
int main() {
int n, m;
cin >> n >> m;
for(int i = 0; i < m; ++i) {
int u, v;
char w;
cin >> u >> v >> w;
vec[u].push_back(Edge(v, (int)(w - 'a')));
}
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
putchar(solve(i, j, 0) ? 'A' : 'B');
}
putchar('\n');
}
return 0;
}