AtCoder Grant Contest 10 F-Tree Gameゲームdfs

1067 ワード

題意:各ノードに重み値があり、AliceとBobが交代で操作するツリーが与えられます.
所定のゲーム開始ポインタはノードCを指す.下記の操作を継続して行います.
1.現在のノードの重み付け値-1を、そのノードから隣接ノードにポインタを移動します.
一方が移動できない(ポインタが指すノードの重み値が0)場合は負けます.
解法:
sg[i]をi番目のノードが必勝状態であるか必敗状態であるかを示し,1を必勝,0を必敗とする.
2つの重要な性質を発見する必要があります.
1.先手は、現在のノードよりも厳密に重みが小さい場所にのみ移動します.さもないと相手は駒の位置を戻すだけで相手を殺すことができる.
2.重み値が厳密に小さい隣接ノードiが存在し、sg[i]=0であれば、現在のノードは必勝位置である.
あとの细かいところがすごく考えちゃいました~~
#include 
#include 
#include 
using namespace std;
typedef unsigned int uii;
const int maxn=3005;
int n,a[maxn],u,v,sg[maxn];
vector vec[maxn];
void dfs(int u) {
    sg[u]=0;
    for (uii i=0;ia[v]&&sg[v]==0) {
            sg[u]=1;
            break;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;++i)
        scanf("%d",&a[i]);
    for (int i=0;i