1 条题解

  • 0
    @ 2026-3-29 15:45:03

    居然场切紫题了!

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=1e6+10,inf=1e18;
    int n,m,st,ed,mn,a[310][310];;
    struct node{int to,w,c,nxt;}e[N];
    int head[N],cur[N],len;
    void add(int x,int y,int w,int c)
    {
    	e[++len]={y,w,-c,head[x]};head[x]=len;
    	e[++len]={x,0,c,head[y]};head[y]=len;
    }
    int d[N];
    bool vis[N],inq[N];
    bool spfa()
    {
    	for(int i=1;i<=ed;i++)d[i]=inf;
    	queue<int>q;
    	q.push(st);
    	d[st]=0;
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		inq[x]=0;
    		for(int i=head[x];i;i=e[i].nxt)
    		{
    			int y=e[i].to;
    			if(e[i].w&&d[y]>d[x]+e[i].c)
    			{
    				d[y]=d[x]+e[i].c;
    				if(!inq[y])q.push(y),inq[y]=1;
    			}
    		}
    	}
    	return d[ed]!=inf;
    }
    int dfs(int x,int res)
    {
    	if(x==ed||!res)return res;
    	vis[x]=1;
    	int ans=0;
    	for(int i=cur[x];i;i=e[i].nxt)
    	{
    		int y=e[i].to;
    		cur[x]=i;
    		if(!vis[y]&&e[i].w&&d[y]==d[x]+e[i].c)
    		{
    			int sum=dfs(y,min(res-ans,e[i].w));
    			e[i].w-=sum;
    			e[i^1].w+=sum;
    			mn+=sum*e[i].c;
    			ans+=sum;
    			if(ans==res)break;
    		}
    	}
    	vis[x]=0;
    	return ans;
    }
    int dinic()
    {
    	int ans=0,flow;
    	while(spfa())
    	{
    		memcpy(cur,head,sizeof(cur));
    		while((flow=dfs(st,inf)))ans+=flow;
    	}
    	return ans;
    }
    int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
    #define nx i+dx[k]
    #define ny j+dy[k]
    int get(int x,int y){return (x-1)*m+y;}
    bool pd(int x,int y){return (x>0&&x<=n&&y>0&&y<=m&&a[x][y]);}
    signed main()
    {
    	cin>>n>>m;int sum=0;len=1,st=0,ed=n*m+1;
    	for(int i=1;i<=n;i++)
    	{
    		string s;cin>>s;
    		for(int j=1;j<=m;j++)
    		{
    			if(s[j-1]=='1')a[i][j]=0;
    			if(s[j-1]=='2')a[i][j]=2,sum++;
    			if(s[j-1]=='?')a[i][j]=1;
    		}
    	}
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j])
    	{
    		if((i+j)%2==1)
    		{
    			add(st,get(i,j),1,0);
    			for(int k=0;k<=3;k++)if(pd(nx,ny))
    			{
    				add(get(i,j),get(nx,ny),1,a[i][j]+a[nx][ny]-2);
    			}
    		}
    		else add(get(i,j),ed,1,0);
    	}
    	dinic();
    	if(sum+mn==0)
    	{
    		cout<<"Yes";
    	}
    	else
    	{
    		cout<<"No";
    	}
    	return 0;
    }
    • 1

    信息

    ID
    7797
    时间
    3000ms
    内存
    1024MiB
    难度
    8
    标签
    递交数
    27
    已通过
    6
    上传者