hdu 4862KM&最小费用最大流
/*最小K路径覆盖的模型,用费用流或者KM算法解决,
构造二部图,X部有N*M个节点,源点向X部每个节点连一条边,
流量1,费用0,Y部有N*M个节点,每个节点向汇点连一条边,流量1,
费用0,如果X部的节点x可以在一步之内到达Y部的节点y,那么就连边x->y,
费用为从x格子到y格子的花费能量减去得到的能量,流量1,
再在X部增加一个新的节点,表示可以从任意节点出发K次,源点向其连边,
费用0,流量K,这个点向Y部每个点连边,费用0,流量1,最这个图跑最小费用最大流,
如果满流就是存在解,反之不存在,最小费用的相反数就是可以获得的最大能量
因为要求最小路径覆盖,n*m-maxflow<=k ,所以maxflow+k>=n*m,如果是满流的话就存在最小费用最大流可求出,否则*/
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 0x3fffffff
#define N 500
struct node
{
int u,v,w,f,next;
} bian[N*N*10];
char ss[N][N];
int ma[N][N];
int manha(int i,int j,int ii,int jj)
{
if(ma[i][j]==ma[ii][jj])
return ii-i+jj-j-1-ma[i][j];
return ii-i+jj-j-1;
}
/*模板*/
int dis[N],pre[N],head[N],visit[N],yong,maxflow;
void init()
{
memset(head,-1,sizeof(head));
yong=0;
}
void build(int u,int v,int w,int f)
{
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].f=f;
bian[yong].next=head[u];
head[u]=yong++;
}
void adde(int u,int v,int w,int f)
{
build(u,v,w,f);
build(v,u,-w,0);
}
int min_cost(int s,int t)
{
int sum=0;
while(1)
{
memset(visit,0,sizeof(visit));
memset(pre,-1,sizeof(pre));
for(int i=0; i<=t; i++) //注意是从0开始而不是从s开始
dis[i]=inf;
queue<int>q;
visit[s]=1;//必须是s
q.push(s);
dis[s]=0;
while(!q.empty ())
{
int u=q.front ();
for(int index=head[u]; index!=-1; index=bian[index].next)
{
int v=bian[index].v;
if(bian[index].f&&dis[v]>dis[u]+bian[index].w)
{
dis[v]=dis[u]+bian[index].w;
pre[v]=index;
if(!visit[v])
{
visit[v]=1;
q.push (v);
}
}
}
q.pop();
visit[u]=0;//是u
}
int i;
if(dis[t]==inf)
break;
int minn=inf;
i=pre[t];
while(i!=-1)
{
if(minn>bian[i].f)
minn=bian[i].f;
i=pre[bian[i].u];
}
maxflow+=minn;
sum=sum+minn*dis[t];
i=pre[t];
while(i!=-1)
{
bian[i].f-=minn;
bian[i^1].f+=minn;
i=pre[bian[i].u];
}
}
return sum;
}
/*最小费用最大流*/
int main()
{
int n,m,i,j,k,s,t,T,kk,r,l,su,index=0;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d%d",&n,&m,&k);
for(i=1; i<=n; i++)
scanf("%s",ss[i]+1);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
ma[i][j]=ss[i][j]-'0';
s=0;
kk=2*n*m+1;
t=kk+1;
for(i=1; i<=n*m; i++)
adde(s,i,0,1);
adde(s,kk,0,k);
for(i=n*m+1; i<=n*m*2; i++)
{
adde(kk,i,0,1);
adde(i,t,0,1);
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
for(r=j+1; r<=m; r++)
{
int w=manha(i,j,i,r);
adde((i-1)*m+j,(i-1)*m+r+n*m,w,1);
}
for(r=i+1; r<=n; r++)
{
int w=manha(i,j,r,j);
adde((i-1)*m+j,(r-1)*m+j+n*m,w,1);
}
}
maxflow=0;
su=min_cost(s,t);
printf("Case %d : ",++index);
if(maxflow==n*m)
printf("%d\n",-su);
else
printf("%d\n",-1);
}
return 0;
}
hdu 4862KM&最小费用最大流的更多相关文章
- 【网络流#2】hdu 1533 - 最小费用最大流模板题
最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...
- hdu 1533(最小费用最大流)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 1533 最小费用最大流(模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1533 这道题直接用了模板 题意:要构建一个二分图,家对应人,连线的权值就是最短距离,求最小费用 要注意void ...
- hdu 3667(最小费用最大流+拆边)
Transportation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 6437 /// 最小费用最大流 负花费 SPFA模板
题目大意: 给定n,m,K,W 表示n个小时 m场电影(分为类型A.B) K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠 接下来给定m场电影的 s t w op 表示电影的 开始 ...
- hdu 4067(最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4067 思路:很神奇的建图,参考大牛的: 如果人为添加t->s的边,那么图中所有顶点要满足的条件都 ...
- hdu 2485(最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2485 思路:题目的意思是删除最少的点使1,n的最短路大于k.将点转化为边,容量为1,费用为0,然后就是 ...
- hdu 6201(最小费用最大流)
transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/1 ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
随机推荐
- 洛谷P3402 最长公共子序列
题目背景 DJL为了避免成为一只咸鱼,来找Johann学习怎么求最长公共子序列. 题目描述 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作 ...
- Java I/O 的工作机制浅析
I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 ...
- python爬虫值requests模块
- 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...
- flask 中的模板语法 jinja2及render_template的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- mariadb的安装
mysql (分支 mariadb)1.安装mariadb -yum -源码编译安装 -下载rpm安装 yum和源码编译安装的区别? 1.路径区别-yum安装的软件是他自定义的,源码安装的软件./co ...
- [转]Linux下paste命令详解
转自:http://blog.csdn.net/andy572633/article/details/7214126 paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功 ...
- 【转】Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...
- css3 画小蜜蜂
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- python--8、面向对象的深入知识
面向对象的三大特性 上一篇我们讲的主要内容都符合面向对象的封装特性.那么问题来了?面向对象难道只有封装性么?当然不是,作为一个这么难理解的东西,要是只有封装性都对不起我们死了这么多脑细胞!所以,晴天霹 ...
- React Component 生命周期
一般而言 Component 有以下三种生命周期的状态: Mounting:已插入真实的 DOM Updating:正在被重新渲染 Unmounting:已移出真实的 DOM 针对 Component ...