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
AC × 3
AC × 42
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