Submission #106138

#TimeUsernameProblemLanguageResultExecution timeMemory
106138luciocfCop and Robber (BOI14_coprobber)C++14
0 / 100
16 ms16640 KiB
#include <bits/stdc++.h>
#include "coprobber.h"

using namespace std;

const int maxn = 510;

struct State
{
    int u, w, q;
};

int n;

int win[maxn][maxn][2];

int mark[maxn][maxn][2];

vector<int> grafo[maxn];

vector<State> game[maxn][maxn][2];

void build(int u, int w, int q)
{
    if (u == w) return;

    if (q == 0)
    {   
        game[u][w][0].push_back({u, w, 1});
        for (auto v: grafo[u])
            game[u][w][0].push_back({v, w, 1});
    }
    else
    {
        for (auto v: grafo[w])
            game[u][w][1].push_back({u, v, 0});
    }
}

void dfs(int u, int w, int q)
{
    if (mark[u][w][q] == 2) return;

    if (u == w)
    {
        if (q == 0) win[u][w][q] = 1;
        else win[u][w][q] = 0;

        mark[u][w][q] = 2;
        return;
    }

    mark[u][w][q] = 1;

    for (auto S: game[u][w][q])
    {
        if (q == 0)
        {
            int v = S.u;
            
            if (mark[v][w][1])
            {
                if (mark[v][w][1] == 2 && win[v][w][1] == 0) win[u][w][0] = 1;
                continue;
            }

            dfs(v, w, 1);

            if (win[v][w][1] == 0) win[u][w][0] = 1;
        }
        else
        {
            int v = S.w;

            if (mark[u][v][0])
            {
                if (mark[u][v][0] == 1 || win[u][v][0] == 0) win[u][w][1] = 1;
                continue;
            }

            dfs(u, v, 0);

            if (win[u][v][0] == 0) win[u][w][1] = 1;
        }
    }

    mark[u][w][q] = 2;
}

int start(int N, bool A[MAX_N][MAX_N])
{
    n = N;

    for (int i = 0; i < n; i++)
    	for (int j = 0; j < n; j++)
    		if (A[i][j])
    			grafo[i].push_back(j);

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int q = 0; q < 2; q++)
                build(i, j, q);

    for (int i = 0; i < 1; i++)
    {
        memset(win, 0, sizeof win); memset(mark, 0, sizeof mark);

        for (int j = 0; j < n; j++)
            dfs(i, j, 0);

        bool ok = 1;
        for (int j = 0; j < n; j++)
            if (win[i][j][0] == 0) 
                ok = 0;

        if (ok) return i;
    }

    return -1;
}

int nextMove(int R)
{
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...