POJ 2195 & HDU 1533 Going Home(最小费用最大流)
这就是一道最小费用最大流问题
最大流就体现到每一个‘m’都能找到一个‘H’,但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值)
然后最小费用最大流模板就是再用最短路算法找最小费用路径。然后在找到这条路径上面的最大流。。就这样一直找下去
代码:
1 //这是一个最小费用最大流问题
2 //最大费用最小流只要在添加边的时候换一下位置就好了
3 //求最大费用最大流只需要把费用换成相反数,用最小费用最大流求解即可
4 #include <cstdio>
5 #include <cstring>
6 #include <algorithm>
7 #include <queue>
8 #include <cmath>
9 using namespace std;
10 const int MAXN = 10000;
11 const int MAXM = 100000;
12 const int INF = 0x3f3f3f3f;
13 struct Edge
14 {
15 int v, next, cap, flow, cost;
16 int x, y;
17 } e[MAXM];
18 struct shudui
19 {
20 int x,y;
21 }p1[MAXN],p2[MAXN];
22 int head[MAXN],tol;
23 int pre[MAXN],dis[MAXN];
24 bool vis[MAXN];
25 int N, M;
26 void init()
27 {
28 N = MAXN;
29 tol = 0;
30 memset(head, -1, sizeof(head));
31 }
32 void add_edge(int x,int y,int cap,int cost)
33 {
34 e[tol].v=y;
35 e[tol].cap=cap;
36 e[tol].flow=0;
37 e[tol].cost=cost;
38 e[tol].next=head[x];
39 head[x]=tol++;
40
41 e[tol].v=x;
42 e[tol].cap=0;
43 e[tol].flow=0;
44 e[tol].cost=-cost;
45 e[tol].next=head[y];
46 head[y]=tol++;
47 }
48 int spfa(int s,int t)
49 {
50 queue<int>r;
51 for(int i=0;i<MAXN;++i)
52 {
53 vis[i]=0;
54 dis[i]=INF;
55 pre[i]=-1;
56 }
57 dis[s]=0;
58 vis[s]=1;
59 r.push(s);
60 while(!r.empty())
61 {
62 //printf("**\n");
63 int u=r.front();
64 r.pop();
65 vis[u]=0;
66 for(int i=head[u];i!=-1;i=e[i].next)
67 {
68 int v=e[i].v;
69 if(e[i].cap>e[i].flow && dis[v]>dis[u]+e[i].cost)
70 {
71 dis[v]=dis[u]+e[i].cost;
72 pre[v]=i;
73 if(!vis[v])
74 {
75 vis[v]=1;
76 r.push(v);
77 }
78 }
79 }
80 }
81 if(pre[t]==-1) return 0;
82 else return 1;
83 }
84 int MincostMaxflow(int s,int t,int &cost)
85 {
86 int flow=0;
87 cost=0;
88 while(spfa(s,t))
89 {
90
91 int minn=INF;
92 for(int i=pre[t];i!=-1;i=pre[e[i^1].v])
93 {
94 if(minn>e[i].cap-e[i].flow)
95 {
96 minn=e[i].cap-e[i].flow;
97 }
98 }
99 for(int i=pre[t];i!=-1;i=pre[e[i^1].v])
100 {
101 e[i].flow+=minn;
102 e[i^1].flow-=minn;
103 cost+=e[i].cost*minn;
104 }
105 flow+=minn;
106 }
107 return flow;
108 }
109
110 int main()
111 {
112 int n,m,st,en;
113 char s[105][105];
114 while(~scanf("%d%d",&n,&m) && n+m)
115 {
116 init();
117 int index1=0,index2=0;
118 for(int i=1;i<=n;++i)
119 scanf("%s",s[i]+1);
120 st=0;
121 for(int i=1;i<=n;++i)
122 {
123 for(int j=1;j<=m;++j)
124 {
125 if(s[i][j]=='m')
126 {
127 index1++;
128 p1[index1].x=i;
129 p1[index1].y=j;
130
131 }
132 else if(s[i][j]=='H')
133 {
134 index2++;
135 p2[index2].x=i;
136 p2[index2].y=j;
137
138 }
139 }
140 }
141 //printf("%d %d\n",index1,index2);
142 en=index1+index2+1;
143 for(int i=1;i<=index1;++i)
144 {
145 add_edge(st,i,1,0);
146 }
147 for(int i=index1+1;i<=index1+index2;++i)
148 {
149 add_edge(i,en,1,0);
150 }
151 for(int i=1;i<=index1;++i)
152 {
153 for(int j=1;j<=index2;++j)
154 {
155 int cost=abs(p1[i].x-p2[j].x)+abs(p1[i].y-p2[j].y);
156 add_edge(i,index1+j,1,cost);
157 }
158 }
159 int ans=0;
160 MincostMaxflow(st,en,ans);
161 printf("%d\n",ans);
162 }
163 return 0;
164 }
POJ 2195 & HDU 1533 Going Home(最小费用最大流)的更多相关文章
- poj 2195 二分图带权匹配+最小费用最大流
题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...
- POJ 2195:Going Home(最小费用最大流)
http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...
- 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 1533 Going Home 最小费用最大流 (模板题)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU 5988.Coding Contest 最小费用最大流
Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- hdu 3667(拆边+最小费用最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- LeetCode448-数组中消失的数字
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能 ...
- Spark Streaming处理Flume数据练习
把Flume Source(netcat类型),从终端上不断给Flume Source发送消息,Flume把消息汇集到Sink(avro类型),由Sink把消息推送给Spark Streaming并处 ...
- MalformedByteSequenceException: 1字节的 UTF-8 序列的字节 1 无效
记住,每次修改了配置之后都 clean 一下,把 target 删除 第一种解决方案 去掉 pom.xml 中的 properties <properties> <maven.com ...
- iptables原理及防火墙规则语法基础
Iptables 防火墙 学习总结: 三张表介绍: filter负责过滤数据包,包括的规则链有,input(进),output(出)和forward(转发); nat则涉及到网络地址转换,包括的规则 ...
- postgresql中权限介绍
postgresql权限分为实例的权限,数据库的权限,模式的权限,对象的权限,表空间的权限 实例的权限:由pg_hba.conf文件控制,控制那些用户那些IP以哪种方式连接数据库 数据库的权限:是否允 ...
- 使用modify修改内表
modify修改内表,有这样一种方式,MODIFY TABLE itab FROM wa [TRANSPORTING ..]. 然后这里的内表itab是有条件的,这个itab必须要有table key ...
- VKM5对应的BAPI或者函数
在业务上,当一个交货单创建后,可能需要使用事物VKM5进行批准(解冻)才能做后续的捡配,发货过账等操作,通过搜索引擎发现,很多人也都会问是否有对应的bapi或者函数,替代VKM5,能够自开发程序进行批 ...
- ABAP program lines are wider than the internal table
错误详细描述: An exception occurred that is explained in detail below.The exception, which is assigned to ...
- 优化太多的if-else
来源java小当家 第1种方法:提前return,减少else判断 1 // 1.优化前 2 private int handlerPre1(boolean flag) { 3 if(flag){ 4 ...
- ftp上传文件出现553 Could not creat files 严重文件传输错误
之前上传文件到云服务器上一直出错,发现可以下载但是不能上传和编辑,后来终于找到原因了,是因为上传文件所在文件夹默认只有root用户才有写权限,所以我们还要将写权限赋予给其他用户.可以用Xshell 5 ...