Going Home HDU - 1533(最大费用最小流)
Your task is to compute the minimum amount of money you need to pay in order to send these n little men into those n different houses. The input is a map of the scenario, a '.' means an empty space, an 'H' represents a house on that point, and am 'm' indicates there is a little man on that point.
You can think of each point on the grid map as a quite large square, so it can hold n little men at the same time; also, it is okay if a little man steps on a grid with a house without entering that house.
InputThere are one or more test cases in the input. Each case starts with a line giving two integers N and M, where N is the number of rows of the map, and M is the number of columns. The rest of the input will be N lines describing the map. You may assume both N and M are between 2 and 100, inclusive. There will be the same number of 'H's and 'm's on the map; and there will be at most 100 houses. Input will terminate with 0 0 for N and M.
OutputFor each test case, output one line with the single integer, which is the minimum amount, in dollars, you need to pay.
Sample Input
- 2 2
- .m
- H.
- 5 5
- HH..m
- .....
- .....
- .....
- mm..H
- 7 8
- ...H....
- ...H....
- ...H....
- mmmHmmmm
- ...H....
- ...H....
- ...H....
- 0 0
Sample Output
- 2
- 10
- 28
题意:使得每个m都对应一个H时的最短的路径
题解:找一个源点,连接所有的m,再找一个汇点,使得所有H指向这个汇点。
然后跑一边最大费用最小流就ok了
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- const int MAXX=;
- const int INF=0x3f3f3f3f;
- struct node
- {
- int st;
- int to;
- int next;
- int cap;
- int cost;
- }edge[MAXX];
- char mp[][];
- int head[MAXX],tol;
- int pre[MAXX],dis[MAXX];
- bool vis[MAXX];
- int n,m,p;
- struct node1
- {
- int x,y;
- node1(){}
- node1(int a,int b)
- {
- x=a;
- y=b;
- }
- };
- vector<node1> v1,v2;
- void init()
- {
- tol=;
- memset(head,-,sizeof(head));
- v1.clear();
- v2.clear();
- }
- void addedge(int u,int v,int cap,int cost)
- {
- edge[tol].st=u;
- edge[tol].to=v;
- edge[tol].cap=cap;
- edge[tol].cost=cost;
- edge[tol].next=head[u];
- head[u]=tol++;
- edge[tol].st=v;
- edge[tol].to=u;
- edge[tol].cap=;
- edge[tol].cost=-cost;
- edge[tol].next=head[v];
- head[v]=tol++;
- }
- bool SPFA(int s,int t)
- {
- queue<int> q;
- memset(dis,INF,sizeof(dis));
- memset(vis,,sizeof(vis));
- memset(pre,-,sizeof(pre));
- dis[s]=;
- vis[s]=;
- q.push(s);
- while(!q.empty())
- {
- int u=q.front(); q.pop();
- vis[u]=;
- for(int i=head[u];i!=-;i=edge[i].next)
- {
- int to=edge[i].to;
- if(edge[i].cap>&&dis[to]>dis[u]+edge[i].cost)
- {
- dis[to]=dis[u]+edge[i].cost;
- pre[to]=i;
- if(!vis[to])
- {
- vis[to]=;
- q.push(to);
- }
- }
- }
- }
- if(pre[t]==-)return ;
- return ;
- }
- int minCostMaxFlow(int s,int t)
- {
- int cost=;
- while(SPFA(s,t))
- {
- int minn=INF;
- for(int i=pre[t];i!=-;i=pre[edge[i].st])
- minn=min(minn,edge[i].cap);
- for(int i=pre[t];i!=-;i=pre[edge[i].st])
- {
- edge[i].cap-=minn;
- edge[i^].cap+=minn;
- }
- cost+=minn*dis[t];
- }
- return cost;
- }
- int main()
- {
- while(scanf("%d%d",&n,&m)&&m&&n)
- {
- getchar();
- init();
- for(int i=;i<n;i++)
- {
- scanf("%s",mp[i]);
- getchar();
- }
- for(int i=;i<n;i++)
- for(int j=;j<m;j++)
- {
- if(mp[i][j]=='m')
- v1.push_back(node1(i,j));
- if(mp[i][j]=='H')
- v2.push_back(node1(i,j));
- }
- int l=v1.size();
- int r=v2.size();
- for(int i=;i<v1.size();i++)
- {
- node1 N1=v1[i];
- int x=i+;
- addedge(,x,,);
- for(int j=;j<v2.size();j++)
- {
- node1 N2=v2[j];
- int y=j+l+;
- int D=abs(N1.x-N2.x)+abs(N1.y-N2.y);
- addedge(x,y,,D);
- addedge(y,x,,D);
- if(i==l-)
- addedge(y,l+r+,,);
- }
- }
- int ans=minCostMaxFlow(,l++r);
- printf("%d\n",ans);
- }
- return ;
- }
Going Home HDU - 1533(最大费用最小流)的更多相关文章
- POJ 2195 & HDU 1533 Going Home(最小费用最大流)
这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...
- POJ-2135-Farm Tour(最大费用最小流)模板
Farm Tour POJ - 2135 When FJ's friends visit him on the farm, he likes to show them around. His farm ...
- hdu 1533 Going Home 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 On a grid map there are n little men and n house ...
- hdu 1533 Going Home 最小费用最大流 入门题
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- hdu 4322(最大费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4322 思路:建图真的是太巧妙了!直接copy大牛的了: 由于只要得到糖就肯定有1个快乐度,在这一点上糖 ...
- HDU 4322Candy 最大费用最大流
由于被小孩子不喜欢的糖果的对小孩产生的效力是一样的,所以我们在网络流的时候先不考虑. 1 - 源点0到1~N个糖果,容量为1,费用为02 - 根据like数组,like[i][j] == 1时在糖果j ...
- hdu 1533 Going Home 最小费用最大流 (模板题)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 4406 最大费用最大流
题意:现有m门课程需要复习,已知每门课程的基础分和学分,共有n天可以复习,每天分为k个时间段,每个时间段可以复习一门课程,并使这门课程的分数加一,问在不挂科的情况下最高的绩点. 思路:(没做过费用流的 ...
- 【进阶——最小费用最大流】hdu 1533 Going Home (费用流)Pacific Northwest 2004
题意: 给一个n*m的矩阵,其中由k个人和k个房子,给每个人匹配一个不同的房子,要求所有人走过的曼哈顿距离之和最短. 输入: 多组输入数据. 每组输入数据第一行是两个整型n, m,表示矩阵的长和宽. ...
随机推荐
- Android开发之利用SQLite进行数据存储
Android开发之利用SQLite进行数据存储 Android开发之利用SQLite进行数据存储 SQLite数据库简单介绍 Android中怎样使用SQLite 1 创建SQLiteOpenHel ...
- layoutSubviews, setNeedsLayout, layoutIfNeeded
layoutSubviews总结 ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————- - (voi ...
- Prevent the "split brain" by configuring the majority of nodes
## Prevent the "split brain" by configuring the majority of nodes (total number of nodes / ...
- Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图
Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方面的开 ...
- C# 获得资源文件下图片的路径
最终实现正确的代码是: button8.Image = System.Drawing.Image.FromFile(@"..\\..\\Resources\\GAOJIBAN.png&quo ...
- luogu 3796 【模板】AC自动机(加强版)
我太菜了 棒神%%% #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib ...
- bzoj 1601 灌水
题目大意: 决定把水灌到n块农田,农田被数字1到n标记 把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库 建造一个水库需要花费wi,连接两块土地需要花费Pij. 计算所需的最少代价 ...
- 根据JSON创建对应的HIVE表
本文提供一种用SCALA把JSON串转换为HIVE表的方法,由于比较简单,只贴代码,不做解释.有问题可以留言探讨 package com.gabry.hiveimport org.json4s._im ...
- vue2.0 引入font-awesome
网上的大部分教程复杂而且难看懂,其实两步就能搞定. 先cnpm install font-awesome --save引入依赖 然后在main.js引入 font-awesome/css/font-a ...
- 【转】Linux之printf命令
转自:http://blog.chinaunix.net/uid-9525959-id-2001528.html printf FORMAT [ARGUMENT]... printf OPTION [ ...