hdu1569
2024-08-30 02:37:46
题解:
网络流
最大权独立集=总和-最大流
然后构图
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int num,k,dis[N],t,ans,q[N],fi[N],ne[N],ans1,zz[N],sl[N],n,m,a[][];
void jb(int x,int y,int z)
{
ne[num]=fi[x];
fi[x]=num;
zz[num]=y;
sl[num++]=z;
swap(x,y);
z=;
ne[num]=fi[x];
fi[x]=num;
zz[num]=y;
sl[num++]=z;
}
int bfs()
{
memset(dis,0xff,sizeof dis);
dis[]=;
int l=,r=;
q[]=;
while (l<r)
{
int j=q[++l];
for (int i=fi[j];i!=-;i=ne[i])
if (dis[zz[i]]<&&sl[i]>)
{
dis[zz[i]]=dis[j]+;
q[++r]=zz[i];
}
}
if (dis[n]>)return ;
return ;
}
int find(int x,int low)
{
int b=;
if (x==n)return low;
for (int i=fi[x];i!=-;i=ne[i])
if (sl[i]>&&dis[zz[i]]==dis[x]+&&(b=find(zz[i],min(low,sl[i]))))
{
sl[i]-=b;
sl[i^]+=b;
return b;
}
return ;
}
void doit()
{
memset(fi,-,sizeof fi);
memset(a,,sizeof a);
memset(sl,,sizeof sl);
ans1=ans=;num=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
scanf("%d",&a[i][j]);
ans1+=a[i][j];
if ((i+j)&)jb(,(i-)*m+j+,a[i][j]);
else jb((i-)*m+j+,n*m+,a[i][j]);
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if ((i+j)&)
{
if (i!=)jb((i-)*m+j+,(i-)*m+j+,1e9);
if (i!=n)jb((i-)*m+j+,i*m+j+,1e9);
if (j!=)jb((i-)*m+j+,(i-)*m+j,1e9);
if (j!=m)jb((i-)*m+j+,(i-)*m+j+,1e9);
}
int t;ans=;
n=n*m+;
while (bfs())
while (t=find(,1e9))ans+=t;
printf("%d\n",ans1-ans);
}
int main()
{
while (~scanf("%d%d",&n,&m))doit();
}
最新文章
- dotNet Core开发环境搭建及简要说明
- Mac配置Qt环境——Could not resolve SDK path for &#39;macosx10.8&#39;
- Java web 使用页面压缩
- HDU 5745 La Vie en rose (DP||模拟) 2016杭电多校联合第二场
- 第九篇 Integration Services:控制流任务错误
- CSS垂直居中对齐
- lua for循环
- c++课程实训 银行储蓄系统
- Unity3D 集合插件目录
- MongoDB 介绍及Windows下安装
- python-摩尔斯电码查询器
- [Leetcode][Python]37: Sudoku Solver
- 04737_C++程序设计_第4章_类和对象
- opencv如何实现【不用全局变量进行滚动条控制】
- Duplicate <;http>; element detected
- Bootstrap3 栅格系统-Less mixin 和变量
- (NO.00002)iOS游戏精灵战争雏形(八)
- visual studio 2015 Opencv 3.4.0配置
- ASP.NET MVC概述及第一个MVC程序
- css中的float属性以及清除方法 (2011-09-03 17:36:26)