【HDOJ5520】Number Link(费用流)
题意:NxM的格子有些上面有数字,现在要把奇数跟偶数配对连起来,其他的格子连成一个个回路,
单独的相邻两个格子相连也算是一个回路按两条边算,连线不能相交,
给出相邻两个格子相连的费用,求最小的总费用,无解输出-1
n,m<=50
保证答案在int范围之内
思路:费用流神仙建模
From https://blog.csdn.net/ahi219/article/details/51454133
把每个格子拆成两个点,然后如下连边:
源点向左边的奇数格子和空格子连容量为1,费用为0的边。
右边的偶数格子和空格子向汇点连容量为1,费用为0的边。
左边的格子向右边相邻的格子连容量为1,费用为cost的边。
这样求一遍最小费用最大流即可,如果不是满流,则为无解。
这样建模的原因是把每空格子拆成入点和出点,奇数只有入点,偶数只有出点。
这样保证了每个空格子会有一个入度和一个出度,要么成环,要么参与到奇偶相连中。
奇数只有出度偶数只有出度保证了一定是奇数连向偶数。
这样求一遍费用流最后就是结果,如果不是满流说明有的点没连上所以无解。
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 31000
#define M 51
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 1010000000 bool inq[N];
int num[M][M][],a[M][M],
q[N],dis[N],head[N],vet[N],nxt[N],len1[N],len2[N],fan[N],pre[N][],
n,source,src,tot,s,ans,flow; void add(int a,int b,int c,int d)
{
nxt[++tot]=head[a];
vet[tot]=b;
len1[tot]=c;
len2[tot]=d;
head[a]=tot; nxt[++tot]=head[b];
vet[tot]=a;
len1[tot]=;
len2[tot]=-d;
head[b]=tot;
} bool spfa()
{
for(int i=;i<=s;i++)
{
dis[i]=oo;
inq[i]=false;
}
int t=; int w=;
q[]=source; dis[source]=; inq[source]=true;
while(t<w)
{
t++; int u=q[t%(s+)]; inq[u]=false;
int e=head[u];
while(e)
{
int v=vet[e];
if(len1[e]&&dis[u]+len2[e]<dis[v])
{
dis[v]=dis[u]+len2[e];
pre[v][]=u;
pre[v][]=e;
if(!inq[v])
{
w++; q[w%(s+)]=v; inq[v]=true;
}
}
e=nxt[e];
}
}
return (dis[src]!=oo);
} void mcf()
{
int k=src;
int t=oo;
while(k!=source)
{
int e=pre[k][];
t=min(t,len1[e]);
k=pre[k][];
}
k=src;
while(k!=source)
{
int e=pre[k][];
len1[e]-=t;
len1[fan[e]]+=t;
ans+=t*len2[e];
k=pre[k][];
}
flow+=t;
} void init()
{
memset(head,,sizeof(head));
memset(pre,,sizeof(pre));
tot=;
} int main()
{
freopen("hdoj5520.in","r",stdin);
//freopen("hdoj5520.out","w",stdout);
for(int i=;i<N;i++)
if(i&) fan[i]=i+;
else fan[i]=i-;
int cas;
scanf("%d",&cas);
for(int v=;v<=cas;v++)
{
int n,m;
scanf("%d%d",&n,&m);
int F=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==) F++;
if(a[i][j]&&a[i][j]%==) F++;
}
s=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=;k++) num[i][j][k]=++s;
init();
source=s+; src=s+; s+=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(a[i][j]==||a[i][j]%==) add(source,num[i][j][],,);
if(a[i][j]==||a[i][j]%==) add(num[i][j][],src,,);
}
for(int i=;i<=n-;i++)
for(int j=;j<=m;j++)
{
int x;
scanf("%d",&x);
add(num[i][j][],num[i+][j][],,x);
add(num[i+][j][],num[i][j][],,x);
}
for(int i=;i<=n;i++)
for(int j=;j<=m-;j++)
{
int x;
scanf("%d",&x);
add(num[i][j][],num[i][j+][],,x);
add(num[i][j+][],num[i][j][],,x);
}
ans=; flow=;
while(spfa()) mcf();
if(flow==F) printf("Case #%d: %d\n",v,ans);
else printf("Case #%d: -1\n",v);
}
return ;
}
【HDOJ5520】Number Link(费用流)的更多相关文章
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广
3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 174 Solved: 9 ...
- CodeForces 164C Machine Programming 费用流
Machine Programming 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co One remark ...
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- Aizu 2304 Reverse Roads 费用流
Reverse Roads Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...
- Cyclic Tour HDUOJ 费用流
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- 【 UVALive - 2197】Paint the Roads(上下界费用流)
Description In a country there are n cities connected by m one way roads. You can paint any of these ...
随机推荐
- 第18题:在O(1)时间删除链表结点+删除链表中重复的节点
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...
- Centos7多内核情况下修改默认启动内核方法
1.1 进入grub.cfg配置文件存放目录/boot/grub2/并备份grub.cfg配置文件 [root@linux-node1 ~]# cd /boot/grub2/ [root@linux ...
- <Docker学习>1. 简介
Q: Dokcer是什么? A: 是一种虚拟化技术.参考https://www.imooc.com/learn/867快速了解Docker. Q: 传统虚拟机技术和Dokcer的区别? A: 传统虚拟 ...
- 在Ubuntu下配置jdk+maven
1.在官网上下载对应Linux版本的jdk 2.在终端输入命令将下载好的jdk解压并且转移到指定的路径如:首先执行 tar -zxvf jdk-8u181-linux-x64.tar.gz 然后 ...
- windows下pip安装python模块时报错【转】
windows下pip安装python模块时报错总结 请给作者点赞--> 原文链接 1 权限问题 C:\Users\ljf>pip install xlwt Exception: Trac ...
- http--一次完整的HTTP事务是怎样一个过程?【转】
一次完整的HTTP事务是怎样一个过程? 如有收获请给作者点赞 --> 原文链接 声明:本文章中的说法仅是个人理解总结,不一定完全正确,但是可以有助于理解. 当我们在浏览器的地址栏输入 www.l ...
- CSU 1326: The contest(分组背包)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意: n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做 ...
- netcfg.exe
netcfg.exe 编辑 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 目录 1 简介 2 可能出现问题 简介编辑 netcfg.exe是Kaspersky的 ...
- MongoDB快速入门学习笔记7 MongoDB的用户管理操作
1.修改启动MongoDB时要求用户验证加参数 --auth 即可.现在我们把MongoDB服务删除,再重新添加服务 mongod --dbpath "D:\work\MongoDB\dat ...
- ArrayList以及Map小练
ArrayList常用方法 public static void main(String[] args) { List list = new ArrayList(); List list1 = new ...