HDU 1569 方格取数(2)

来源:互联网 发布:怎样学java编程基础 编辑:程序博客网 时间:2024/04/29 13:21

方格取数(2)

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2878 Accepted Submission(s): 871


Problem Description
给你一个m*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。

Input
包括多个测试实例,每个测试实例包括2整数m,n和m*n个非负数(m<=50,n<=50)

Output
对于每个测试实例,输出可能取得的最大的和

Sample Input
3 375 15 21 75 15 28 34 70 5

Sample Output
188

Author
ailyanlu

Source
Happy 2007

Recommend
8600

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <queue>#include <stack>#include <map>#include <set>#include <list>#define INT_INF 0x3fffffff#define LL_INF 0x3fffffffffffffff#define EPS 1e-12#define MOD 1000000007#define PI 3.141592653579798#define N 3000#define E 100000using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef double DB;const int zl[4][2]={{1,0},{-1,0},{0,1},{0,-1}};struct Edge{    int en,cap,flow,next;} edge[E];int head[N] , tot , now[N];int source,sink,tot_num;int pre[N] , dis[N] , gap[N];void add_edge(int st,int en,int cap){    edge[tot].en=en;    edge[tot].cap=cap;    edge[tot].flow=0;    edge[tot].next=head[st];    head[st]=tot++;    edge[tot].en=st;    edge[tot].cap=0;    edge[tot].flow=0;    edge[tot].next=head[en];    head[en]=tot++;}void augment(int flow){    for(int i=source;i!=sink;i=edge[now[i]].en)    {        edge[now[i]].flow+=flow;        edge[now[i]^1].flow-=flow;    }}int sap(){    memset(dis,0,sizeof(dis));    memset(gap,0,sizeof(gap));    memset(pre,-1,sizeof(pre));    for(int i=0;i<tot_num;i++)        now[i]=head[i];    gap[0]=tot_num;    int point=source,flow=0,min_flow=INT_INF;    while(dis[source]<tot_num)    {        bool fg=false;        for(int i=now[point];i!=-1;i=edge[i].next)            if(edge[i].cap-edge[i].flow>0 && dis[point]==dis[edge[i].en]+1)            {                min_flow=min(min_flow,edge[i].cap-edge[i].flow);                now[point]=i;                pre[edge[i].en]=point;                point=edge[i].en;                if(point==sink)                {                    flow+=min_flow;                    augment(min_flow);                    point=source;                    min_flow=INT_INF;                }                fg=true;                break;            }        if(fg) continue;        if(--gap[dis[point]]==0) break;        int Min=tot_num;        for(int i=head[point];i!=-1;i=edge[i].next)            if(edge[i].cap-edge[i].flow>0 && Min>dis[edge[i].en])            {                Min=dis[edge[i].en];                now[point]=i;            }        gap[dis[point]=Min+1]++;        if(point!=source) point=pre[point];    }    return flow;}int build(int n,int m){    memset(head,-1,sizeof(head));    tot=0;    int ans=0;    source=N-2; sink=N-1; tot_num=N;    for(int i=0; i<n; i++)        for(int j=0,pos,val; j<m; j++)        {            scanf("%d",&val);            ans+=val;            pos=i*m+j;            if((i+j)%2==0) add_edge(pos,sink,val);            else            {                add_edge(source,pos,val);                for(int k=0; k<4; k++)                {                    if(i+zl[k][0]>=0 && i+zl[k][0]<n && j+zl[k][1]>=0 && j+zl[k][1]<m)                        add_edge(pos,(i+zl[k][0])*m+j+zl[k][1],INT_INF);                }            }        }    return ans;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        int ans=build(n,m);        ans-=sap();        printf("%d\n",ans);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信找不到群聊怎么办 人又傻又蠢怎么办 微信不能收红包怎么办 gta5有任务没做怎么办 害怕死亡怎么办才16岁 被罩四个角的绳怎么办 电脑进水花屏了怎么办 法院判了不执行怎么办 优酷安装不上怎么办 保温杯磕了个坑怎么办 韩国旅游签证5年怎么办 新娘裙太长怎么办请茶 花无缺逾期20天怎么办 酷云密码忘了怎么办 我的声音不好听怎么办 耳朵后面长了个硬包怎么办 汽车油表不动了怎么办 油位传感器坏了怎么办 孕妇牙疼耳朵疼怎么办 耳机戴的耳朵疼怎么办 擤鼻涕左耳朵疼怎么办 擤完鼻涕耳朵疼怎么办 五岁儿童耳朵疼怎么办 耳朵里面长了个硬包怎么办 耳朵里有耳屎响怎么办 耳屎粘在耳膜上怎么办 小孩脖子上有淋巴结怎么办 大腿内侧的筋疼怎么办 大腿内侧磨的疼怎么办 孕晚期大腿根疼怎么办 吞口水耳朵会响怎么办 耳朵里面老痒该怎么办 牙疼头疼耳朵疼怎么办 耳朵里流水还疼怎么办 单侧耳朵里面疼怎么办 打到睾丸很疼怎么办 大拇手指关节疼怎么办 早上醒来耳朵嗡嗡响怎么办 两个月宝宝起湿疹怎么办 运动时耳朵闷堵怎么办 刚打的耳洞红肿怎么办