记录编号 431173 评测结果 AAAAAAAAAA
题目名称 王者之剑 最终得分 100
用户昵称 Gravatar하루Kiev 是否通过 通过
代码语言 C++ 运行时间 0.113 s
提交时间 2017-07-31 11:44:51 内存使用 2.01 MiB
显示代码纯文本
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#define inf 0x7fffffff
using namespace std;
int n,m,s,t,map[105][105],id[105][105],zz1,zz,st[80000],tot,ori,dis[80000];
bool cas[105][105],flag[80000];
struct node{
	   int to,next,flow;
}e[80000];
void add(int x,int y,int f){
	 e[zz].to=y;
	 e[zz].flow=f;
	 e[zz].next=st[x];
	 st[x]=zz; 
	 zz++;
}
bool bfs(){
	 queue<int> q;
	 memset(dis,-1,sizeof(dis));
	 q.push(s);
	 dis[s]=0;
	 while(!q.empty()){
	 	   int k=q.front();
	 	   q.pop();
	 	   for(int i=st[k];i!=-1;i=e[i].next){
	 	       int v=e[i].to;
			   if(dis[v]==-1&&e[i].flow){
			   	  dis[v]=dis[k]+1;
			   	  q.push(v);
			   }
		   }
	 }
	 if(dis[t]!=-1) return true;
	 else return false;
}
int dfs(int x,int last){
	if(x==t||last==0) return last;
	int ans=last;
	for(int i=st[x];i!=-1;i=e[i].next){
		int v=e[i].to;
		if(e[i].flow&&dis[v]==dis[x]+1&&ans!=0){
		   int tmp=dfs(v,min(e[i].flow,ans));
		   if(!tmp){
		   	  dis[v]=0;
		   	  continue;
		   }
		   e[i].flow-=tmp;
		   e[i^1].flow+=tmp;
		   ans-=tmp;
		}
	}return last-ans;
}
int main(){
    freopen("Excalibur.in","r",stdin);
    freopen("Excalibur.out","w",stdout);
	scanf("%d%d",&n,&m);
	memset(st,-1,sizeof(st));
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++){
	        scanf("%d",&map[i][j]);
			if((i+j)&1) cas[i][j]=true;
	        else cas[i][j]=false;
	        id[i][j]=++zz1;
			ori+=map[i][j];
	    }
	s=0,t=zz1+1;  
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++){
	        if(cas[i][j]){
	           add(id[i][j],t,map[i][j]);
	           add(t,id[i][j],0);
            }
            if(!cas[i][j]){
			   add(s,id[i][j],map[i][j]);
			   add(id[i][j],s,0);
			   if(i-1!=0) {add(id[i][j],id[i-1][j],inf);  add(id[i-1][j],id[i][j],0);}
			   if(i+1!=n+1) {add(id[i][j],id[i+1][j],inf);  add(id[i+1][j],id[i][j],0);}
			   if(j-1!=0) {add(id[i][j],id[i][j-1],inf);  add(id[i][j-1],id[i][j],0);}
			   if(j+1!=m+1) {add(id[i][j],id[i][j+1],inf);  add(id[i][j+1],id[i][j],0);} 
			}
        }
    while(bfs())tot+=dfs(s,0x7fffffff);
    printf("%d",ori-tot);
}