只有9分,怀疑是建图建错了

P2774 方格取数问题

改了一个小错误,但还是只有 18 分 ```cpp #include<bits/stdc++.h> using namespace std; const int size=1e6+10; const int inf=0x3f3f3f3f; int m,n,a[110][110],S,T,sum=0; int dx[]={-1,0,1,0}; int dy[]={0,-1,0,1}; inline int encode(int x,int y){return (x-1)*n+y;} int ver[size],edge[size],nxt[size],head[size],tot=1,d[size],maxflow=0; inline void add(int x,int y,int z){ ver[++tot]=y;edge[tot]=z;nxt[tot]=head[x];head[x]=tot; ver[++tot]=x;edge[tot]=0;nxt[tot]=head[y];head[y]=tot; } inline bool bfs(){ queue<int> q; while(!q.empty()) q.pop(); memset(d,0,sizeof(d)); q.push(S);d[S]=1; while(!q.empty()){ int x=q.front();q.pop(); for(int i=head[x];i;i=nxt[i]){ int y=ver[i],z=edge[i]; if(z&&(!d[y])){ d[y]=d[x]+1; q.push(y); if(y==T) return 1; } } } return 0; } int dinic(int x,int flow){ if(x==T) return flow; int used=0; for(int i=head[x];i;i=nxt[i]){ int y=ver[i],z=edge[i]; if(d[y]==d[x]+1&&z&&used<flow){ int now=dinic(y,min(flow,z)); used+=now; edge[i]-=now; edge[i^1]+=now; } } if(!used) d[x]=0; return used; } int main(){ ios::sync_with_stdio(0); cin>>m>>n; S=0;T=m*n+1; for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) cin>>a[i][j],sum+=a[i][j]; for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) ((i+j)%2==0)?add(encode(i,j),T,a[i][j]):add(S,encode(i,j),a[i][j]); for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) if((i+j)&1) for(int k=0;k<4;++k) if(i+dx[k]<=m&&i+dx[k]>=1&&j+dy[k]<=n&&j+dy[k]>=1) add(encode(i,j),encode(i+dx[k],j+dy[k]),inf); int flow; while(bfs()) while(flow=dinic(S,inf)) maxflow+=flow; cout<<sum-maxflow<<endl; return 0; } ```
by Belarus @ 2020-07-26 08:32:58


|