Submission #81214

#TimeUsernameProblemLanguageResultExecution timeMemory
81214wzyCop and Robber (BOI14_coprobber)C++11
100 / 100
945 ms12284 KiB
#include <bits/stdc++.h> #include "coprobber.h" using namespace std; bool G[505][505][2]; int R[505][505]; int AD[505]; int n; tuple<int,int,int> P[505][505][2]; // Game Theory // G[i][j][0] wins if there is a k such that G[k][j][1] is winning // G[i][j][1] wins if all k adjacence to j G[i][k][0] is true int currA = 0 , currB = -1; int start(int N, bool A[MAX_N][MAX_N]) { n = N; queue<tuple<int,int,int > > q; for(int i = 0 ; i < N ; i++){ G[i][i][0] = 1; G[i][i][1] = 1; q.push(make_tuple(i,i,0)); q.push(make_tuple(i,i,1)); } // fill R[][] for(int i = 0 ; i < n; i++){ for(int j = 0 ; j < n; j ++){ for(int k = 0 ; k < n; k ++){ if(k == j) continue; R[i][j] = R[i][j] + A[j][k]; } } } while(!q.empty()){ tuple<int,int,int> u = q.front(); q.pop(); if(get<2>(u)){ for(int i = 0 ; i < n; i++){ if(A[i][get<0>(u)] || i == get<0>(u)){ if(G[i][get<1>(u)][0] == 0){ G[i][get<1>(u)][0] = 1; tuple<int,int,int> t = u; get<0>(t) = i, get<2>(t) = 0; P[get<0>(t)][get<1>(t)][get<2>(t)] = u; q.push(t); } } } } else{ for(int i = 0 ; i < n; i ++){ if(A[i][get<1>(u)]){ R[get<0>(u)][i]--; if(R[get<0>(u)][i] == 0){ G[get<0>(u)][i][1] = true; tuple<int,int,int> t = u; get<1>(t) = i; get<2>(t) = 1; P[get<0>(t)][get<1>(t)][get<2>(t)] = u; //cout<< get<0>(u) <<" " << get<1>(u) <<" " << get<2>(u) << endl; //cout<< get<0>(t) <<" " << get<1>(t) <<" " << get<2>(t) << endl; q.push(t); } } } } } bool can = true; for(int i = 0 ; i < n; i ++){ if(!G[0][i][0]) can = false; } if(can){ return 0; } else{ return -1; } } int nextMove(int R) { currB = R; tuple<int,int,int> L = P[currA][currB][0]; return currA = get<0>(L); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...