「ヤリトレーニング2017 2日目」ボードゲーム

私は(エスケープ)した後、あなたにメリークリスマスを望みます

トピックポータル

分析:

ボード上の最初のパスは、図2の二部グラフから構成されています。

試合はこれだけ負けにフィニッシュに到達、何の増強パスは存在しませんよう、試合をダウンする限り、フリップ側として、キーポイントに行ってきました場合は、二部グラフのために、第1の最大マッチング、上側の手を見つけます

だから、長い非キーマッチポイントにアリスとボブは間違いなくキーマッチポイントに来る、そしてアリスは勝ちます

そして、これらの点がうまく非キーマッチポイントであるかを尋ねます

233を考えることは本当に難しいです

私は良い食品233よ

書式#include <cstdioを> 
する#include <cmath> 
の#include <CStringの> 
の#include <アルゴリズム> 
書式#include <マップ> 
書式#include <キュー>

#define MAXN 500005
 の#define MAXM 105
 の#define INF 0x3f3f3f3f

使用して 名前空間はstdを、

インライン肺の 着色()
{
    長い 長い NUM = 0、フラグ= 1char型のC;
    一方、((C = GETCHAR())< ' 0 ' || C> ' 9 'であれば(C == ' - ')フラグ= - 1 一方、(C> = ' 0 ' && C <= ' 9 ')NUM = NUM * 10 + C- 48、C = GETCHAR()。
    リターン NUM * フラグ。
}

整数N、M。
int型S、T;
INT [MAXN]モミ、NXT [MAXN] [MAXN]キャップに[MAXN]、CNT。
INT H [MAXN]、VIS [MAXN]。
チャーS [MAXM] [MAXM]。
int型ANS [MAXM] [MAXM]。

インライン無効 newnode(int型のu、int型 V、int型ワット)
{[に対して ++ CNT] = V、NXT [CNT] =男性[U]、男性[U] = CNT、キャップ[CNT] = W;}
インラインのボイド挿入(int型のu、int型 V、int型ワット)
{newnode(U、V、W)、newnode(V、U、0 );}

インラインBOOL BFS()
{
    memsetの(H、 - 1はsizeof H); H [S] = 0 ;
    キュー < 整数 > Q; Q.push(S);
    しばらく(!Q.empty())
    {
        INT U = Q.front(); Q.pop()。
        INT I = FIR [U]; iは、iが= NXTを[I])
             であれば(!〜H &&キャップ[i]は[I]乃至])、H = H [I]乃至] [U] + 1 、 ([I]に)Q.push。
    }
    リターンH [T]。
}

インライン再」 20(あなたと、あなたは流れ)
{
    もし(!U == T ||フロー)リターン・フロー;
    int型は =使用0 ;
    INT ;私は= [U] I =モミNXT [I])の
         場合(== H [I]乃至]キャップ[I] && H [U] + 1 
        {
            int型のデルタ= 8月([i]は、分(flow-に、使用されるキャップ[I]))。
            キャップ[I] - =デルタ、キャップ[I ^ 1 + =使用] + =デルタ、デルタ。
            もし(使用==フロー)リターン・フロー。
        }
    もし H [U] = - (使用!)1 リターンが使用され;
}

インラインint型dinic()
{
    int型 NUM = 0 ;
    一方、(BFS())+か時間前(S INF)。
    戻り値のNUM;
}

インライン無効 DFS(int型U)
{
    VIS [U] = 1 以下のためのint型 ;;私はNXT [I]を= [U] I =モミ)場合(!VIS && [[I]へ] DFS([I]へ)キャップ[I]);
}

インライン無効 DFS2(int型U)
{
    VIS [U] = 1 以下のためのint型 ;;私はNXT [I]を= [U] I =モミ)場合(!VIS &&キャップ[I ^ [[I]へ] 1 ])DFS2([I]へ)。
}

インラインINTのgetId(INT I、int型の J){ 戻り I * M + J- M;}

int型のmain()
{
    N = GetIntで()、M = GetIntで()。int型 NUM = 0 ;
    以下のためにINT iが= 1 ; I <= N; I ++)のscanf(" %S "、S [I] + 1 )。
    S = N * M + 1、T = S + 1、CNT = 1 以下のためにINT iが= 1 ; I <= N; I ++)のためのINT J = 1 ; J <= Mであり、j ++ 
    {
        もし(((I + J)&1)&& S [I] [J] == ' ' 
        {
            挿入(S、のgetId(i、j)は、1 );
            もし(S [I- 1 ] [j] == ' ')インサート(のgetId(i、j)は、のgetId(I- 1 、j)は、INF)。
            もし(S [I + 1 ] [j] == ' ')インサート(のgetId(i、j)は、のgetId(I + 1 、j)は、INF)。
            もし(S [I] [J- 1 ] == ' ')インサート(のgetId(i、j)は、のgetId(I、J- 1 )、INF)。
            もし(S [I] [J + 1 ] == ' ')インサート(のgetId(i、j)は、のgetId(I、J + 1)、INF)。
        }
        もし(!((I + J)&1)&& S [i]は[J] == ' ')、インサート(のgetId(i、j)は、T、1 );
    }
    dinic();
    DFS(S)。
    以下のためにINT iは= 1 ; I <= N; I ++)のためのINT J = 1 ; J <= Mであり、j ++ 場合(((I + J)&1)&& S [I] [J] == ' ' && VIS [のgetId(I、J)])ANS [I] [J] = 1、NUM ++ 
    memsetの(VIS、0はsizeof VIS)。
    DFS2(T)。
    以下のためにINT iが= 1 ; I <= N; I ++)のためのINT J = 1 ; J <= Mであり、j ++ 場合!(((I + J)&1)&& S [I] [J] == ' ' && VIS [のgetId(I、J)])ANS [I] [J] = 1、NUM ++ 
    printf(" %dの\ n " 、NUM)。
    以下のためにINT iが= 1 ; I <= N; I ++)のためのINT J = 1 ; J <= Mであり、j ++ 場合(ANS [I] [J])のprintf(" %D%D \ n " 、私、j)は、
}
コードの表示

おすすめ

転載: www.cnblogs.com/Darknesses/p/12104277.html