1 条题解
-
0
居然场切紫题了!
#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
- 上传者