题目链接
思路:dp【i】【j】【k】表示先手为i,后手为j,前一轮的边权为k,然后进行dfs记忆化搜索。
dp会定义基本就出来,想不到的话怎么也做不出来QAQ。
#include<bits/stdc++.h>
using namespace std;
const int maxn=150;
int dp[maxn][maxn][maxn];
vector<pair<int,int>>g[maxn];
char c;
int dfs(int x,int y,int now)
{
if(dp[x][y][now]>=0) return dp[x][y][now];
for(auto it:g[x])
{
if(it.second>=now&&dfs(y,it.first,it.second)==0) return dp[x][y][now]=1;
}
return dp[x][y][now]=0;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1,u,v;i<=m;++i)
{
cin>>u>>v>>c;
g[u].push_back({v,c});
}
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dfs(i,j,0);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
if(dp[i][j][0]==0) printf("B");
else printf("A");
printf("\n");
}
}