제출 #375684

#제출 시각아이디문제언어결과실행 시간메모리
375684peijarDango Maker (JOI18_dango_maker)C++17
0 / 100
1 ms492 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN =3000; char couleur[MAXN][MAXN]; bool pris[MAXN][MAXN]; int idDumpling[MAXN][MAXN]; vector<int> adj[MAXN]; int matchAvec[MAXN]; bool vu[MAXN]; /* x * x * . . . * * . * x . * x . * Graphe biparti : on cherche max independent set * si S independant max, si e arete, une extremité pas dans S ! * Donc complementaire de S = min vertex cover * Donc nbDumplingsPotentiels - maxMatch = rep */ bool dfs(int u) { if (vu[u]) return false; vu[u] = true; for (auto v : adj[u]) if (matchAvec[v] == -1 or dfs(matchAvec[v])) { matchAvec[v] = u; return true; } return false; } signed main(void) { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int nbLig, nbCol; cin >> nbLig >> nbCol; for (int iLig(0); iLig < nbLig; ++iLig) for (int iCol(0); iCol < nbCol; ++iCol) cin >> couleur[iLig][iCol]; int nbDumplingsPotentiels(0); for (int iLig(0); iLig < nbLig; ++iLig) for (int iCol(0); iCol < nbCol; ++iCol) { if (iLig + 2 < nbLig and couleur[iLig][iCol] == 'R' and couleur[iLig+1][iCol] == 'G' and couleur[iLig+2][iCol] == 'W') nbDumplingsPotentiels++; if (iCol+2 < nbCol and couleur[iLig][iCol] == 'R' and couleur[iLig][iCol+1] == 'G' and couleur[iLig][iCol+2] == 'W') nbDumplingsPotentiels++; } int nbVu(0); for (int iLig(0); iLig < nbLig; ++iLig) for (int iCol(0); iCol < nbCol; ++iCol) { idDumpling[iLig][iCol] = -1; if (iLig + 2 < nbLig and couleur[iLig][iCol] == 'R' and couleur[iLig+1][iCol] == 'G' and couleur[iLig+2][iCol] == 'W') idDumpling[iLig][iCol] = nbVu++; } int nbGauche = nbVu; nbVu = 0; for (int iLig(0); iLig < nbLig; ++iLig) for (int iCol(0); iCol < nbCol; ++iCol) if (iCol+2 < nbCol and couleur[iLig][iCol] == 'R' and couleur[iLig][iCol+1] == 'G' and couleur[iLig][iCol+2] == 'W') { // R G W matchAvec[nbVu] = -1; if (idDumpling[iLig][iCol] != -1) adj[idDumpling[iLig][iCol]].push_back(nbVu); if (iLig and idDumpling[iLig-1][iCol+1] != -1) adj[idDumpling[iLig-1][iCol+1]].push_back(nbVu); if (iLig > 1 and idDumpling[iLig-2][iCol+2] != -1) adj[idDumpling[iLig-2][iCol+2]].push_back(nbVu++); } int maxMatching(0); for (int i(0); i < nbGauche; ++i) { fill(vu, vu + nbGauche, false); maxMatching += dfs(i); } int ret = nbDumplingsPotentiels - maxMatching; cout << ret << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...