http://acm.hdu.edu.cn/showproblem.php?pid=1533

这道题直接用了模板

题意:要构建一个二分图,家对应人,连线的权值就是最短距离,求最小费用

要注意void init(int n) 这个函数一定要写

一开始忘记写这个WA了好几发

还有这个题很容易T掉,赋值建图要简化,一开始构建成网络流那种图一直T

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define oo 0x13131313
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN=;
const int MAXM=;
struct Edge
{
int to,next,cap,flow,cost;
} edge[MAXM];
int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
int N;
void init(int n)
{
N = n;
tol = ;
memset(head,-,sizeof(head));
}
void addedge(int u,int v,int cap,int cost)
{
edge[tol].to = v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].to = u;
edge[tol].cap = ;
edge[tol].cost = -cost;
edge[tol].flow = ;
edge[tol].next = head[v];
head[v] = tol++;
}
bool spfa(int s,int t)
{
queue<int>q;
for(int i = ; i < N; i++)
{
dis[i] = INF;
vis[i] = false;
pre[i] = -;
}
dis[s] = ;
vis[s] = true;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for(int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if(edge[i].cap > edge[i].flow &&
dis[v] > dis[u] +edge[i].cost)
{
dis[v] = dis[u] + edge[i].cost;
pre[v] = i;
if(!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
if(pre[t] == -)return false;
else return true;
}
int minCostMaxflow(int s,int t,int &cost)
{
int flow = ;
cost = ;
while(spfa(s,t))
{
int Min = INF;
for(int i = pre[t]; i != - ; i = pre[edge[i^].to])
{
if(Min > edge[i].cap - edge[i].flow)
Min = edge[i].cap - edge[i].flow;
}
for(int i = pre[t]; i != -; i = pre[edge[i^].to])
{
edge[i].flow += Min;
edge[i^].flow -= Min;
cost += edge[i].cost*Min;
}
flow += Min;
}
return flow;
}
struct Home
{
int x,y;
} H[MAXN],P[MAXN];
int main()
{
int totH,totP;
int NN,MM;
while(cin>>NN>>MM&&NN&&MM)
{
getchar();
init(MAXN);
char c;
totH=;
totP=;
for(int i=; i<=NN; i++)
{
for(int j=; j<=MM; j++)
{
scanf("%c",&c);
if(c=='H') totH++,H[totH].x=i,H[totH].y=j;
else if(c=='m') totP++,P[totP].x=i,P[totP].y=j;
}
getchar();
} int ANS=;
int NNN=totP+totH;
for(int i=; i<=totP; i++)
for(int j=; j<=totH; j++)
{
int t=abs(P[i].x-H[j].x)+abs(P[i].y-H[j].y);
addedge(i,j+totP,,t);
}
for(int i=; i<=totP; i++)
addedge(NNN+,i,,);
for(int i=totP+; i<=NNN; i++)
addedge(i,NNN+,,);
minCostMaxflow(NNN+,NNN+,ANS);
printf("%d\n",ANS);
}
return ;
}

HDU 1533 最小费用最大流(模板)的更多相关文章

  1. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  2. hdu 1533(最小费用最大流)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  4. 图论算法-最小费用最大流模板【EK;Dinic】

    图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...

  5. 洛谷P3381 最小费用最大流模板

    https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...

  6. 最大流 && 最小费用最大流模板

    模板从  这里   搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...

  7. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

  8. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  9. hdu 4862KM&最小费用最大流

    /*最小K路径覆盖的模型,用费用流或者KM算法解决, 构造二部图,X部有N*M个节点,源点向X部每个节点连一条边, 流量1,费用0,Y部有N*M个节点,每个节点向汇点连一条边,流量1, 费用0,如果X ...

随机推荐

  1. ecstore小记

    主要app base 基础MVCdbeav 数据库扩展pam 登录认证setup 系统安装工具image 图片存取site 站点desktop 后台操作ectools 电商基础工具b2c 订单,商品, ...

  2. JavaScript学习笔记——数据类型强制转换和隐式转换

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  3. Flex布局语法与实践

    一.参考文献 阮一峰 Flex布局的语法 阮一峰 Flex布局的实践 二.Flex语法 (一)Flex是什么 Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状 ...

  4. ansible定时任务

    不得不说,ansible很强大,ansible定制任务模块显示 ansible all -m cron -a 'name="ban IP of login" minute=* ho ...

  5. Python-面向对象编程(二)

    面向对象进阶篇: 初级篇中我们介绍了面向对象基本知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 2.介绍了类中的对象.方法和属性及类中内置的方法 3.类 是一个模板 ...

  6. Java多线程编程核心技术---拾遗增补

    线程状态验证 public class MyThread extends Thread { public MyThread() { System.out.println("构造方法中的状态: ...

  7. [工具]Swagger-api接口文档描述

    摘要 工作中经常的用到webapi,之前都是提供的使用postman模拟请求的截图,非常的不方便,如果能在项目中集成一个在线查看接口说明的地方,肯定更方便更直观.在网上看到swagger这个组件,界面 ...

  8. FZU2169 shadow题解

    http://acm.fzu.edu.cn/problem.php?pid=2169 Problem Description YL 是shadow国的国王,shadow国有N个城市.为了节省开支,sh ...

  9. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  10. 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移

    6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...