HDU 1565

方格取数(1)

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5961    Accepted Submission(s): 2268

Problem Description
给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
 
Input
包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20)
 
Output
对于每个测试实例,输出可能取得的最大的和
  
Sample Input
3
75 15 21
75 15 28
34 70 5
 
Sample Output
188
 
最大点权独立集
弱弱的EK算法
邻接矩阵实现 124MS
邻接表实现 15MS
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define N 510 int n;
int src;
int des;
int sum;
int pre[N];
int mpt[N][N];
int map[N][N];
int dir[][]={,,-,,,,,-};
queue<int> q; bool bfs()
{
while(!q.empty()) q.pop();
memset(pre,-,sizeof(pre));
pre[src]=;
q.push(src);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=;v<=n*n+;v++)
{
if(pre[v]==- && mpt[u][v]>)
{
pre[v]=u;
if(v==des) return ;
q.push(v);
}
}
}
return ;
}
int EK()
{
int maxflow=;
while(bfs())
{
int minflow=INF;
for(int i=des;i!=src;i=pre[i])
minflow=min(minflow,mpt[pre[i]][i]);
maxflow+=minflow;
for(int i=des;i!=src;i=pre[i])
{
mpt[pre[i]][i]-=minflow;
mpt[i][pre[i]]+=minflow;
}
}
return maxflow;
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
sum=;
memset(mpt,,sizeof(mpt));
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
scanf("%d",&map[i][j]);
sum+=map[i][j];
}
}
src=;
des=n*n+;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
if((i+j)%==) mpt[src][(i-)*n+j]=map[i][j];
else mpt[(i-)*n+j][des]=map[i][j];
}
}
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
if((i+j)%==)
{
for(k=;k<;k++)
{
int x=i+dir[k][];
int y=j+dir[k][];
if(x>= && x<=n && y>= && y<=n)
{
mpt[(i-)*n+j][(x-)*n+y]=INF;
}
}
}
}
}
printf("%d\n",sum-EK());
}
return ;
}

HDU 1569

和方格取数1数据大小不一样,用上面的会超时,可能是写搓了。

邻接表实现 280ms

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define N 20510 struct Edge
{
int to,next,val;
}edge[N];
int tot;
int head[N]; int n;
int m;
int src;
int des;
int sum;
int pre[N];
int path[N];
int map[N][N];
int dir[][]={,,-,,,,,-};
queue<int> q; void init()
{
tot=;
memset(head,-,sizeof(head));
}
void add(int u,int v,int w)
{
edge[tot].to=v;
edge[tot].val=w;
edge[tot].next=head[u];
head[u]=tot++; edge[tot].to=u;
edge[tot].val=;
edge[tot].next=head[v];
head[v]=tot++; }
bool bfs()
{
while(!q.empty()) q.pop();
memset(pre,-,sizeof(pre));
pre[src]=;
q.push(src);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(pre[v]==- && edge[i].val>)
{
pre[v]=u;
path[v]=i;
if(v==des) return ;
q.push(v);
}
}
}
return ;
}
int EK()
{
int maxflow=;
while(bfs())
{
int minflow=INF;
for(int i=des;i!=src;i=pre[i])
minflow=min(minflow,edge[path[i]].val);
maxflow+=minflow;
for(int i=des;i!=src;i=pre[i])
{
edge[path[i]].val-=minflow;
edge[path[i]^].val+=minflow;
}
}
return maxflow;
}
int main()
{
int i,j,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=;
init();
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf("%d",&map[i][j]);
sum+=map[i][j];
}
}
src=;
des=n*m+;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
if((i+j)%==) add(src,(i-)*m+j,map[i][j]);
else add((i-)*m+j,des,map[i][j]);
}
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
if((i+j)%==)
{
for(k=;k<;k++)
{
int x=i+dir[k][];
int y=j+dir[k][];
if(x>= && x<=n && y>= && y<=m)
{
add((i-)*m+j,(x-)*m+y,INF);
}
}
}
}
}
printf("%d\n",sum-EK());
}
return ;
}

[HDU 1565+1569] 方格取数的更多相关文章

  1. HDU 1565 1569 方格取数(最大点权独立集)

    HDU 1565 1569 方格取数(最大点权独立集) 题目链接 题意:中文题 思路:最大点权独立集 = 总权值 - 最小割 = 总权值 - 最大流 那么原图周围不能连边,那么就能够分成黑白棋盘.源点 ...

  2. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. HDU 1565:方格取数(1)(最大点权独立集)***

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...

  4. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  5. HDU 1569 方格取数(2)

    方格取数(2) Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 15 ...

  6. HDU 1569 方格取数(2) (最小割)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]

    嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...

  8. HDU 1569 方格取数(2)(最大流最小割の最大权独立集)

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

  9. hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 两道题只是数据范围不同,都是求的最大点权独立集. 我们可以把下标之和为奇数的分成一个集合,把下标之和为偶数 ...

随机推荐

  1. IO流05_OutputStream和Writer输出流

    [输出流中的字节流和字符流] [OutPutStream和Writer] [ OutputStream和Writer中包含的方法 ] void write(int c)       将指定的字节/字符 ...

  2. mysql常见的hint(转载的)

    mysql常用的hint对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的. ...

  3. poj 3783 Balls 动态规划 100层楼投鸡蛋问题

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098409.html 题目链接:poj 3783 Balls 动态规划 100层楼投鸡蛋问题 ...

  4. 支付宝api教程,支付宝根据交易号自动充值

    最近公司要用php做一个网站支付宝自动充值的功能,具体就是客户把钱直接转到公司的支付宝账号里,然后在我们网站上填写上交易号,我们网站程序自动获取交易信息,自动给网站的账户充值. 我的具体想法就是利用支 ...

  5. make menuconfig出错需要安装文件

    $ make menuconfig *** Unable to find the ncurses libraries or the *** required header files. *** 'ma ...

  6. win7 蛋疼的时间格式转化

    win7系统 获得系统时间为 2015年1月1日 星期5 10:10 数据库中时间格式 是不认识的 转化为 DateTime.Now.ToString("yyyy-MM-dd HH:mm:s ...

  7. C#调用金数据API

    首先,吐槽一下金数据的API文档 http://help.jinshuju.net/articles/api-intro.html写的很粗糙啊...反正我是没太看明白 拿表单api举例,只告诉你了个地 ...

  8. linux shell命令的常用快捷键

    一些shell的常用快捷键.   Ctrl + a 切换到命令行开始  Ctrl + e 切换到命令行末尾  Ctrl + l 清除屏幕内容  Ctrl + u 清除剪切光标之前的内容  Ctrl + ...

  9. VB6-系统打印常识

    在一次做图片打印的时候,对位置的调整老是不得法,后来通过CBM666老师的帮助才解决问题,分享以下他给的帮助.     , , picA.Width , picA.Height Printer.End ...

  10. Nginx+Keepalived主备负载均衡

    实验环境及软件版本: CentOS版本:    6.6(2.6.32.-504.el6.x86_64) nginx版本:     nginx-1.6.2 keepalived版本:keepalived ...