Submission #38075662
Source Code Expand
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int,int> pii;
int S,T,N;
const int NUM = 90105;
const int INF = 987654321;
int dis[NUM], inq[NUM], work[NUM], vis[NUM];
pii pre[NUM];
vector<vector<int> > v, C, F, cost, rev;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
string mp[301];
bool spfa(){
for(int i=0;i<N;i++){
dis[i]=INF;
pre[i]={i,-1};
inq[i]=0;
work[i]=0;
vis[i]=0;
}
dis[S]=0;
queue<int> q;
q.push(S);
inq[S]=1;
while(!q.empty()){
int x=q.front();
q.pop();
inq[x]=0;
for(int i=0;i<(int)v[x].size();i++){
int nx = v[x][i];
if(C[x][i]>F[x][i]&&dis[nx]>dis[x]+cost[x][i]){
dis[nx]=dis[x]+cost[x][i];
pre[nx]={x,i};
if(!inq[nx]){
q.push(nx);
inq[nx]=1;
}
}
}
}
return pre[T].first!=T;
}
bool update(){
int Min = INF;
for(int x=0;x<N;x++){
if(!vis[x]) continue;
for(int i=0;i<(int)v[x].size();i++){
int nx = v[x][i];
if(C[x][i]>F[x][i]&&!vis[nx]){
Min = min(Min,dis[x] + cost[x][i] - dis[nx]);
}
}
}
if(Min>=INF) return false;
for(int x=0;x<N;x++) if(!vis[x]) dis[x] += Min;
return true;
}
pii sol(int x, int f){
vis[x] = 1;
if(x==T) return {f,0};
for(int &i=work[x];i<(int)v[x].size();i++){
int nx=v[x][i];
int j = rev[x][i];
if(!vis[nx] && C[x][i]>F[x][i] && (true?dis[nx]==dis[x]+cost[x][i]:pre[nx].first == x)){
auto [ret,retcost] = sol(nx,min(C[x][i]-F[x][i],f));
if(ret>0){
F[x][i]+=ret;
F[nx][j]-=ret;
return {ret,retcost+cost[x][i]};
}
}
}
return {0,0};
}
void addEdge(int a, int b, int c, int d){
v[a].push_back(b);
v[b].push_back(a);
C[a].push_back(c);
C[b].push_back(0);
F[a].push_back(0);
F[b].push_back(0);
cost[a].push_back(d);
cost[b].push_back(-d);
rev[a].push_back((int)v[b].size()-1);
rev[b].push_back((int)v[a].size()-1);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,m;cin>>n>>m;
S=0;
T=n*m+1;
N=n*m+2;
v.resize(N);
C.resize(N);
F.resize(N);
cost.resize(N);
rev.resize(N);
int goal = 0;
for(int i=0;i<n;i++){
cin>>mp[i];
for(int j=0;j<m;j++){
goal += mp[i][j]=='2';
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='1') continue;
int vn = i*m+j+1;
if((i+j)%2){
addEdge(S,vn,1,0);
if(mp[i][j]=='2'){
goal++;
}
for(int k=0;k<4;k++){
int ni=i+dx[k], nj=j+dy[k];
if(0<=ni&&ni<n&&0<=nj&&nj<m){
if(mp[i][j]=='?' && mp[ni][nj]=='?') continue;
int nvn = ni*m+nj+1;
addEdge(vn,nvn,1,mp[i][j]=='2' && mp[ni][nj]=='2'?-1:1);
}
}
}
else addEdge(vn,T,1,0);
}
}
int ans = 0, anscost = 0;
spfa();
do{
bool isok = false;
for(int i=0;i<N;i++) work[i]=0;
do{
for(int i=0;i<N;i++) vis[i]=0;
auto [cnt,cost] = sol(S,INF);
anscost += cnt;
ans = max(ans, anscost);
isok = cnt>0;
}while(isok);
}while(update());
bool isok = true;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]!='2') continue;
int vn = i*m+j+1;
if((i+j)%2){
for(int i=0;i<(int)v[S].size();i++){
if(v[S][i] == vn) isok &= F[S][i]>0;
}
}
else{
for(int i=0;i<(int)v[vn].size();i++){
if(v[vn][i] == T) isok &= F[vn][i]>0;
}
}
}
}
cout<<(isok?"Yes":"No");
}
Submission Info
| Submission Time |
|
| Task |
G - Tatami |
| User |
jame0313 |
| Language |
C++ (GCC 9.2.1) |
| Score |
600 |
| Code Size |
4069 Byte |
| Status |
AC |
| Exec Time |
1862 ms |
| Memory |
35008 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
| All |
hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, hand_06.txt, hand_07.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, random_30.txt, random_31.txt, random_32.txt, sample_01.txt, sample_02.txt, sample_03.txt |
| Case Name |
Status |
Exec Time |
Memory |
| hand_01.txt |
AC |
6 ms |
3596 KiB |
| hand_02.txt |
AC |
4 ms |
3600 KiB |
| hand_03.txt |
AC |
2 ms |
3600 KiB |
| hand_04.txt |
AC |
2 ms |
3648 KiB |
| hand_05.txt |
AC |
2 ms |
3616 KiB |
| hand_06.txt |
AC |
3 ms |
3480 KiB |
| hand_07.txt |
AC |
2 ms |
3552 KiB |
| random_01.txt |
AC |
1862 ms |
34996 KiB |
| random_02.txt |
AC |
1039 ms |
26628 KiB |
| random_03.txt |
AC |
38 ms |
6520 KiB |
| random_04.txt |
AC |
812 ms |
23932 KiB |
| random_05.txt |
AC |
1860 ms |
35008 KiB |
| random_06.txt |
AC |
1079 ms |
27464 KiB |
| random_07.txt |
AC |
88 ms |
9140 KiB |
| random_08.txt |
AC |
106 ms |
9568 KiB |
| random_09.txt |
AC |
1831 ms |
34688 KiB |
| random_10.txt |
AC |
97 ms |
9160 KiB |
| random_11.txt |
AC |
150 ms |
11004 KiB |
| random_12.txt |
AC |
62 ms |
7564 KiB |
| random_13.txt |
AC |
1826 ms |
34688 KiB |
| random_14.txt |
AC |
177 ms |
12108 KiB |
| random_15.txt |
AC |
306 ms |
15224 KiB |
| random_16.txt |
AC |
194 ms |
12588 KiB |
| random_17.txt |
AC |
1786 ms |
34176 KiB |
| random_18.txt |
AC |
51 ms |
7012 KiB |
| random_19.txt |
AC |
1664 ms |
33288 KiB |
| random_20.txt |
AC |
62 ms |
7564 KiB |
| random_21.txt |
AC |
1776 ms |
34284 KiB |
| random_22.txt |
AC |
394 ms |
17016 KiB |
| random_23.txt |
AC |
152 ms |
11248 KiB |
| random_24.txt |
AC |
21 ms |
5176 KiB |
| random_25.txt |
AC |
200 ms |
12900 KiB |
| random_26.txt |
AC |
57 ms |
7252 KiB |
| random_27.txt |
AC |
955 ms |
25624 KiB |
| random_28.txt |
AC |
14 ms |
4920 KiB |
| random_29.txt |
AC |
35 ms |
6132 KiB |
| random_30.txt |
AC |
47 ms |
7112 KiB |
| random_31.txt |
AC |
25 ms |
5508 KiB |
| random_32.txt |
AC |
249 ms |
17308 KiB |
| sample_01.txt |
AC |
3 ms |
3556 KiB |
| sample_02.txt |
AC |
2 ms |
3524 KiB |
| sample_03.txt |
AC |
2 ms |
3504 KiB |