题意: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(费用流)的更多相关文章

  1. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  2. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  3. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  4. 【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 ...

  5. CodeForces 164C Machine Programming 费用流

    Machine Programming 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co One remark ...

  6. Codeforces Gym 100002 E "Evacuation Plan" 费用流

    "Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...

  7. Aizu 2304 Reverse Roads 费用流

    Reverse Roads Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...

  8. Cyclic Tour HDUOJ 费用流

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  9. 【 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 ...

随机推荐

  1. LOJ#6342. 跳一跳(期望)

    题意 $n \leqslant 10^5$ Sol 随便推一推就好了吧.. $f[i] = \frac{f[i] + f[i +1] + \dots f[n]}{n - i + 1} + 1$ 移一下 ...

  2. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  3. Gender Equality in the Workplace【职场上的性别平等】

    Gender Equality in the Workplace A new batch of young women - members of the so-called Millennial ge ...

  4. CodeForces:#448 div2 B. XK Segments

    传送门:http://codeforces.com/contest/895/problem/B B. XK Segments time limit per test1 second memory li ...

  5. Java最小堆解决TopK问题

    TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...

  6. [原]sencha touch之panel和tabpanel

    最近在弄senchatouch的项目,所以边学习边开发,边记录,直接记录下test code如下: Panel: Ext.application({ name:'itKingApp', launch: ...

  7. P3398 仓鼠找sugar(树链剖分)

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  8. cogs:1619. [HEOI2012]采花/luogu P2056

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿是 ...

  9. TCP/IP网络编程之多进程服务端(二)

    信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...

  10. laravel5.2总结--软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...