BZOJ1475方格取数
2016-03-12 19:51
288 查看
1475: 方格取数
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 710 Solved: 361
Description
在一个n*n的方格里,每个格子里都有一个正整数。从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大。
Input
第一行一个数n;(n<=30) 接下来n行每行n个数描述一个方阵
Output
仅一个数,即最大和
Sample Input
2
1 2
3 5
Sample Output
6
如果x+y为奇数,(x,y)->T,容量v[x,y]
如果x+y为偶数,S->(x,y),容量v[x,y]
并向四个方向的点连边,容量inf
答案为总收益减去最小割
附上本蒟蒻的代码:
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 710 Solved: 361
Description
在一个n*n的方格里,每个格子里都有一个正整数。从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大。
Input
第一行一个数n;(n<=30) 接下来n行每行n个数描述一个方阵
Output
仅一个数,即最大和
Sample Input
2
1 2
3 5
Sample Output
6
如果x+y为奇数,(x,y)->T,容量v[x,y]
如果x+y为偶数,S->(x,y),容量v[x,y]
并向四个方向的点连边,容量inf
答案为总收益减去最小割
附上本蒟蒻的代码:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define inf 0x7fffffff int n,xx[4]={0,0,1,-1},yy[4]={1,-1,0,0},map[31][31],mark[31][31],h[10001],dis[10001],q[10001],head,tail,cnt=1,ans=0,sum; struct kx { int to,next,v; }edge[10001]; bool pd(int x,int y) { if (x<1 || y<1 || x>n || y>n) return false; else return true; } int read() { int w=0,c=1; char ch=getchar(); while (ch<'0' || ch>'9') { if (ch=='-') c=-1; ch=getchar(); } while (ch>='0' && ch<='9') w=w*10+ch-'0',ch=getchar(); return w*c; } void add(int u,int v,int w) { cnt++,edge[cnt].next=h[u],h[u]=cnt,edge[cnt].to=v,edge[cnt].v=w; cnt++,edge[cnt].next=h[v],h[v]=cnt,edge[cnt].to=u,edge[cnt].v=0; } bool bfs() { int j,p; memset(dis,-1,sizeof(dis)); q[0]=0; dis[0]=0; head=0; tail=1; while (head<tail) { head++; j=q[head]; p=h[j]; while (p) { if (dis[edge[p].to]<0 && edge[p].v>0) { dis[edge[p].to]=dis[j]+1; tail++; q[tail]=edge[p].to; } p=edge[p].next; } } if (dis[n*n+1]>0) return true; else return false; } int dfs(int x,int f) { int w,used=0,i=h[x]; if (x==n*n+1) return f; while (i) { if (edge[i].v && dis[edge[i].to]==dis[x]+1) { w=f-used; w=dfs(edge[i].to,min(w,edge[i].v)); edge[i].v-=w; edge[i^1].v+=w; used+=w; if (used==f) return f; } i=edge[i].next; } if (!used) dis[x]=-1; return used; } int main() { int i,j,b=0,w,k; n=read(); for (i=1;i<=n;i++) for (j=1;j<=n;j++) map[i][j]=read(),ans+=map[i][j]; w=(n*n+1)/2; for (i=1;i<=n;i++) for (j=1;j<=n;j++) if ((i+j)%2==0) b++,mark[i][j]=b; else w++,mark[i][j]=w; for (i=1;i<=n;i++) for (j=1;j<=n;j++) if ((i+j)%2==0) { add(0,mark[i][j],map[i][j]); for (k=0;k<4;k++) if (pd(i+xx[k],j+yy[k])) add(mark[i][j],mark[i+xx[k]][j+yy[k]],inf); } else add(mark[i][j],n*n+1,map[i][j]); while (bfs()) while (sum=dfs(0,inf)) ans-=sum; printf("%d",ans); return 0; }
相关文章推荐
- flann在Linux平台下的编译
- C++实验1-输出两个数中较大的数
- java selenium (十四) 处理Iframe 中的元素
- java selenium (十三) 智能等待页面加载完成
- java selenium (十二) 操作弹出窗口
- java selenium (十一) 操作弹出对话框
- java selenium (十) 操作浏览器
- java selenium (九) 常见web UI 元素操作 及API使用
- 第三次作业 软件产品同质化问题
- 从本地缓存图片
- BZOJ_P1426 收集邮票(概率+动态规划)
- env export set 作用
- ubuntu软件安装五 eclipse和配置pydev
- CSS居中问题终极解决方案
- 第一次实验/1
- java selenium (八) Selenium IDE 用法
- java selenium (五) 元素定位大全
- java selenium (四) 使用浏览器调试工具
- 1759:最长上升子序列
- 从零开始山寨Caffe·柒:KV数据库