最小费用最大流的模板题

超级源点     m       H      超级汇点

容量        1       1        1

费用        0     距离      0

#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<queue>using namespace std;#define MAXN 510
#define inf  1000000000
char z[MAXN][MAXN];int S,T,cnt;
int head[MAXN];
int x2[MAXN],y2[MAXN],x3[MAXN],y3[MAXN];
queue<int>q1;
struct edg
{int fr,to,w,next,co;
}edge[200000];
void add(int u,int v,int w ,int cos)
{edge[cnt].fr=u;edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];edge[cnt].co=cos;head[u]=cnt++;
}
bool vis[MAXN];
int pre[MAXN],dis[MAXN];bool spfa()
{memset(vis,0,sizeof(vis));memset(pre,-1,sizeof(pre));for(int i=0;i<=T;i++)dis[i]=inf;dis[S]=0;q1.push(S);vis[S]=1;while(!q1.empty()){int now = q1.front();q1.pop();vis[now]=0;for(int i=head[now];i!=-1;i=edge[i].next){if(edge[i].w>0){int v=edge[i].to;if(dis[v]>dis[now]+edge[i].co){dis[v]=dis[now]+edge[i].co;pre[v]=i;if(!vis[v]){vis[v]=1;q1.push(v);}}}}}return dis[T]!=inf;
}
int MCMF()
{int ans=0;int flow_sum=0;while(spfa()){int flow = inf;for(int i=pre[T];i!=-1;i=pre[edge[i].fr])if(edge[i].w<flow)flow = edge[i].w;for(int i=pre[T];i!=-1;i=pre[edge[i].fr]){edge[i].w-=flow;edge[i^1].w+=flow;}ans += dis[T];flow_sum += flow;}return ans;
}
int main()
{int n,m;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;int c1,c2;c1=c2=0;for(int i=1;i<=n;i++){scanf("%s",z[i]);for(int j=0;j<m;j++){if(z[i][j]=='m'){x2[c1]=i;y2[c1++]=j;}else if(z[i][j]=='H'){x3[c2]=i;y3[c2++]=j;}}}cnt=0;S=0;T=c1+c2+1;memset(head,-1,sizeof(head));for(int i=1;i<=c1;i++){add(S,i,1,0); // 点 点 流量 费用add(i,S,0,0);}for(int i=0;i<c1;i++){for(int j=0;j<c2;j++){int a=i+1;int b=j+1+c1;add(a,b,1,abs(x2[i]-x3[j])+abs(y2[i]-y3[j]));add(b,a,0,-(abs(x2[i]-x3[j])+abs(y2[i]-y3[j])));}}for(int i=c1+1;i<=c1+c2;i++){add(i,T,1,0);add(T,i,0,0);}int ans=0;ans = MCMF();printf("%d\n",ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/cherryMJY/p/6555867.html

网络流 poj 2195相关推荐

  1. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  2. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

  3. POJ 2195 【二分图最佳匹配】.cpp

    题意: 有 n 个房子和 n 个人 每个人走一个单元你就要付 1$ 有什么办法可以让把所有人都分派到房子里 而花费最少 输入: 给出n m 表示该矩阵由n 行 m 列组成 然后给出一个n*m的图 . ...

  4. 初涉网络流 POJ 1459 Power Network

    怒搞一下午网络流,又去我一块心病. 从2F到SAP再到Dinic最终过掉了. 但是书上说Dinic的时间复杂度为v*v*e.感觉也应该超时的啊,但是过掉了,好诡异. 后两种算法都是在第一种的基础上进行 ...

  5. Poj 2195 Going Home

    题目链接:ヾ(≧∇≦*)ゝ 题意:有n*m的矩阵,H表示这个点是一个房子,m表示这个点是一个人,现在每一个人需要走入一个房间,已经知道的是 认得数目和房子的个数一定是相同的,现在问这些人都回到一个房间 ...

  6. POJ 2195 Going Home 二分图的最大权匹配

    POJ2195 Going Home 最小费用最大流 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2 ...

  7. POJ - 2195 Going Home(二分图最小权匹配+KM+思维建边/最小费用最大流)

    题目链接:点击查看 题目大意:给出一个n*m的地图,现在有一定数量的小人要回到屋子里去,题目保证图中的小人和屋子的数量是一致的,小人回到小屋的距离是两个点坐标的曼哈顿距离,每个小屋只能容纳一个小人,现 ...

  8. POJ 2195 Going Home 最小费用最大流

    这题目同时也可以用KM()算法做,最求小权值匹配而已,权值设置为负数就行,具体KM算法参照:http://blog.csdn.net/cnh294141800/article/details/1895 ...

  9. 【POJ - 2195】Going Home(二分图最优匹配,费用流 或 KM)

    题干: On a grid map there are n little men and n houses. In each unit time, every little man can move ...

最新文章

  1. 回归模型-线性回归算法
  2. 新技术不断涌现,下一代云计算的突破口在哪里?
  3. TPF111视频信号放大器研究
  4. 微软日本每周只上四天班,销售额提升39.9%!网友:老板快来看啊
  5. windows10环境下的RabbitMQ安装步骤(图文)
  6. java高级之Io流
  7. TensorFlow框架的这些操作你肯定不知道!
  8. autoscan、aclocal、automake和autoconf区别
  9. struts与spring整合方法copy
  10. Instagram CEO:苹果iPad用户数少 不值得开发App
  11. java 如何判断余数_用java判断一个数是不是回文数!
  12. 微型计算机原理及应用是啥,微型计算机原理及应用(第2版)
  13. LoadRunner录制app脚本详解
  14. 国际知名品牌广告语欣赏(英汉)
  15. 物联网卡和流量卡相比哪个信号强
  16. 微信分享功能不可用+不能产生回调
  17. java考试真题6_JAVA认证考试历年真题:SCJP认证试题解析6
  18. v-for和v-show一起使用
  19. [ant design vue] 表单验证成功,提示信息不显示
  20. 【Unity3D】Animator动画播放时卡死在第一帧BUG系列

热门文章

  1. 一些VC的快捷键以及调试技巧
  2. Linux C语言解析 yaml,c – 用yaml cpp解析yaml
  3. oracle linux 图形化,Linux下Oracle 12C R2图形化安装过程
  4. braintree php 开发,PHP关于Braintree支付
  5. 使用proxy转发post请求_3分钟短文 | Linux 使用curl发起post请求的4个常用方式
  6. 使用 JS 实现一个简单的日历
  7. svn: E155007 和 E155004
  8. 阿里云天池 Docker练习场(入门赛) 操作步骤
  9. 【CCCC】L2-029 特立独行的幸福 (25分),模拟题,set用法
  10. 【CCCC】L2-023 图着色问题 (25分),,图的染色判定,遍历