1. /*Source Code
  2. Problem: 2195 User: HEU_daoguang
  3. Memory: 1172K Time: 94MS
  4. Language: G++ Result: Accepted
  5. Source Code
  6. */
  7. #include <iostream>
  8. #include <stdio.h>
  9. #include <queue>
  10. #include <math.h>
  11. #include <string.h>
  12. using namespace std;
  13. #define V 6005
  14. #define E 10010000
  15. #define inf 999999999
  16. int n,m;
  17. char map[][];
  18. int hp[V][],mp[V][];
  19.  
  20. int vis[V];
  21. int dist[V];
  22. int pre[V];
  23.  
  24. struct Edge{
  25. int u,v,c,cost,next;
  26. }edge[E];
  27. int head[V],cnt;
  28. void init(){
  29. cnt=;
  30. memset(head,-,sizeof(head));
  31. }
  32.  
  33. void addedge(int u,int v,int c,int cost){
  34. edge[cnt].u=u;edge[cnt].v=v;edge[cnt].cost=cost;
  35. edge[cnt].c=c;edge[cnt].next=head[u];head[u]=cnt++;
  36.  
  37. edge[cnt].u=v;edge[cnt].v=u;edge[cnt].cost=-cost;
  38. edge[cnt].c=;edge[cnt].next=head[v];head[v]=cnt++;
  39. }
  40.  
  41. bool spfa(int begin,int end){
  42. int u,v;
  43. queue<int> q;
  44.  
  45. for(int i=;i<=end+;i++){
  46. pre[i]=-;
  47. vis[i]=;
  48. dist[i]=inf;
  49. }
  50. vis[begin]=;
  51. dist[begin]=;
  52. q.push(begin);
  53.  
  54. while(!q.empty()){
  55.  
  56. u=q.front();
  57. q.pop();
  58. vis[u]=;
  59.  
  60. for(int i=head[u];i!=-;i=edge[i].next){
  61. if(edge[i].c>){
  62. v=edge[i].v;
  63. if(dist[v]>dist[u]+edge[i].cost){
  64. dist[v]=dist[u]+edge[i].cost;
  65. pre[v]=i;
  66. if(!vis[v]){
  67. vis[v]=true;
  68. q.push(v);
  69. }
  70. }
  71. }
  72. }
  73.  
  74. }
  75.  
  76. return dist[end]!=inf;
  77. }
  78.  
  79. int MCMF(int begin,int end){
  80. int ans=,flow;
  81. int flow_sum=;
  82.  
  83. while(spfa(begin,end)){
  84.  
  85. flow=inf;
  86. for(int i=pre[end];i!=-;i=pre[edge[i].u])
  87. if(edge[i].c<flow)
  88. flow=edge[i].c;
  89. for(int i=pre[end];i!=-;i=pre[edge[i].u]){
  90. edge[i].c-=flow;
  91. edge[i^].c+=flow;
  92. }
  93. ans+=dist[end]*flow;
  94. flow_sum+=flow;
  95.  
  96. }
  97. return ans;
  98. }
  99.  
  100. int main()
  101. {
  102. //freopen("in.txt","r",stdin);
  103. while(scanf("%d%d",&n,&m)!=EOF){
  104. if(n== && m==) break;
  105. for(int i=;i<n;i++){
  106. scanf("%s",map[i]);
  107. }
  108. int hcnt=,mcnt=;
  109. for(int i=;i<n;i++)
  110. for(int j=;j<m;j++){
  111. if(map[i][j]=='H'){
  112. hp[hcnt][]=i;
  113. hp[hcnt][]=j;
  114. hcnt++;
  115. }
  116. if(map[i][j]=='m'){
  117. mp[mcnt][]=i;
  118. mp[mcnt][]=j;
  119. mcnt++;
  120. }
  121. }
  122. hcnt--;
  123. mcnt--;
  124. init();
  125. for(int i=;i<=hcnt;i++){
  126. addedge(,i,,);
  127. //addedge(i,0,1,0);
  128. }
  129. for(int j=;j<=mcnt;j++){
  130. addedge(hcnt+j,hcnt+mcnt+,,);
  131. //addedge(hcnt+mcnt+1,hcnt+j,1,0);
  132. }
  133. for(int i=;i<=hcnt;i++)
  134. for(int j=;j<=mcnt;j++){
  135. addedge(i,hcnt+j,,fabs(hp[i][]-mp[j][])+fabs(hp[i][]-mp[j][]));
  136. //addedge(hcnt+j,i,1,fabs(hp[i][0]-mp[j][0])+fabs(hp[i][1]-mp[j][1]));
  137. }
  138. int res=MCMF(,hcnt+mcnt+);
  139. printf("%d\n",res);
  140. }
  141. return ;
  142. }
  143. /*
  144. 2
  145. .m
  146. H.
  147. 5
  148. HH..m
  149. .....
  150. .....
  151. .....
  152. mm..H
  153. 8
  154. ...H....
  155. ...H....
  156. ...H....
  157. mmmHmmmm
  158. ...H....
  159. ...H....
  160. ...H....
  161. 20
  162. ..mm..H..H.H...HHH.m
  163. m.H...H.....H......m
  164. ..H...mm.........m..
  165. Hm.m..H.H...H..m....
  166. mH.Hm....mH........H
  167. m............m......
  168. .m..H...........H..m
  169. H.m.H.....H.......m.
  170. ...m..Hm.....m.H...H
  171. ..H...H....H......mH
  172. ..m.m.....m....mm...
  173. ..........H.......H.
  174. ...mm......m...H....
  175. .....m..H.H......m.m
  176. .H......mm.H.m.m.m.m
  177. HH..........HH..HH..
  178. ...m..H........Hm...
  179. ....H.....H...mHm...
  180. H...........m......m
  181. ....m...H.m.....m...
  182. 20
  183. ...Hm.m.HHH...Hmm...
  184. .H........m.......H.
  185. .......H...H.H......
  186. ....HmH.m....Hm..m..
  187. ....m..m............
  188. H..H.........m....H.
  189. .m.H...m...mH.m..H..
  190. .mH..H.H......m...m.
  191. ...mH...H.......m...
  192. ..Hm..H..H......m.m.
  193. ..mH...H.m..m.H..HH.
  194. m.m......m........m.
  195. ...mH..m.....mH.....
  196. ....m.H.H..........H
  197. ....H.......H....m.H
  198. H.mH.......m.......H
  199. ..............m.HH.H
  200. ..H.........m.m.m...
  201. .........mH.....mmm.
  202. ...mH.m.m.....H..m..
  203. 20
  204. H.H.......H....m....
  205. .....m..H......H..H.
  206. ...H..............m.
  207. mH..mm..m...H.......
  208. ......H....mm.H.....
  209. .mH..mm.....mH.H...H
  210. .........HHH........
  211. ......H.H...mm......
  212. .m..m.H...mHmm...HH.
  213. mm..Hmm.H..m...m.H.m
  214. H.Hm.m.m.....m......
  215. ...........m.......H
  216. ......m......H...m..
  217. ....H..........Hm...
  218. .H..H.m....m........
  219. ...H....Hm..........
  220. m.H.mHm.m.m...H...H.
  221. .m..........m.......
  222. H......H...HmHHm..H.
  223. ..H..m.m...m.H..H...
  224. 20
  225. .m..m..Hm...........
  226. .m..H.H...m.m.m...H.
  227. ........m..mH....H..
  228. ..H...........Hm.H.m
  229. H..H.m........mm..m.
  230. H.......m...........
  231. ..m..Hmmmm...m..mH..
  232. ..H.Hm...H..........
  233. H....m.......mm.....
  234. ....m..m.....m.....m
  235. .H.m.H...H.....H....
  236. .m........mm..H...H.
  237. ..m.......H.mH..mm.H
  238. .......Hm...HH....H.
  239. ...mm....HHH........
  240. ..H.m..H........m...
  241. H.........H.........
  242. HH.H.....m.H..Hm....
  243. ...H.m...H.Hm.....m.
  244. .H..mH..H..H........
  245. 20
  246. m.........m.......m.
  247. ..m.H....m....m...m.
  248. m...H.m.....H.H.....
  249. .....H.Hm.m...m.....
  250. ..mH...H.H.m.H...H..
  251. H....H......m.....m.
  252. ..................H.
  253. .m..m.Hm......m..H..
  254. ....H..H.m.....H...H
  255. ....m.H......m.H...m
  256. ....HH...H...H......
  257. ..H.....m......H.H..
  258. mmH...mmm.....m.....
  259. ..m.......m...mmH...
  260. ......H.H..m...Hm..H
  261. HHHm.H.m........H...
  262. ...mHm.......m....m.
  263. .....mmH.H..H.....m.
  264. ......m..H.....m...H
  265. ..HH..m...mH......H.
  266. 20
  267. m.HHm..HH..m.mHm....
  268. mm..H...............
  269. m...HH.......m.H....
  270. ..mH.m.m.......mmH..
  271. H.m........m.......H
  272. m.H....m....m..m...H
  273. ....m......mm.......
  274. .m.H....m..H..m..H..
  275. H....m......H.......
  276. ...H...........m.m.H
  277. ......H...m...H..m..
  278. .mH..H.H.....m......
  279. ...m.....m.H...HmH.H
  280. m.......H..H.H..mm.H
  281. ...H.........Hm.HH..
  282. .m....H.....m.HHm...
  283. ...HHH...........m..
  284. m............H......
  285. .....m..mm.....m....
  286. .....m..H..H..H....H
  287. 20
  288. ....H.............m.
  289. .....HH..mH..Hm..H..
  290. m...........mH....mm
  291. ..m..m.H......m....m
  292. .H..........mHH....m
  293. ...........m..H.m...
  294. ..H...H.........mHm.
  295. ......H...........H.
  296. H.....H.....H..m....
  297. H.H..H..m...m..mH.m.
  298. ....H...m.H.mHmm.mHm
  299. ..mmm...H....m....H.
  300. .........m..m.......
  301. .m.H....Hm....m.....
  302. .....H.......HH...mH
  303. ..H..H....m.m.....HH
  304. .Hm.............H...
  305. H...Hm.......H.m.m..
  306. .....m..HH...H.....m
  307. ........mHmmH..m....
  308. 20
  309. .....H.......H...m.m
  310. .m..H.m.m....m......
  311. m.H.HHH..mm.........
  312. H...mH.mH...........
  313. ..mHm..m.m......m..m
  314. H.HH.....m...m......
  315. H.mH....H......H....
  316. ...mH.m.mHmH...H....
  317. ........H.....m.....
  318. ..H.......HmH...H...
  319. ......m...HH.m......
  320. .H..m.H...H.........
  321. ...H...m..m..m...m..
  322. .mH..HH......m...H..
  323.  
  324. ...m....H.H.H.m.....
  325. .........H.m........
  326. ..m..H...H......H...
  327. mmH..mH.....m.H..H..
  328. H....mm...H.m...m.mm
  329. ......m.............
  330. 20
  331. ....mH..m...m.....m.
  332. ..m......mHm...H....
  333. .H.....mHm....H..H..
  334. ...HH..........m.m..
  335. ..m..mm........m....
  336. ...m.....H..........
  337. ..mH..H...m.........
  338. ...H.H.....m..mH..m.
  339. ..H.........Hm.Hm..H
  340. ...........H......m.
  341. .............H...mm.
  342. H.m.....Hm.H.m......
  343. ....Hm..m..mm.H...m.
  344. ...H.H.H......H.Hm..
  345. H.m............m....
  346. ..mH.m.m...m..H.m..H
  347. HH.H....m.H..H...m..
  348. .....H.....H...H...H
  349. ........mH.HHm.....m
  350. .H.H.....mmH......m.
  351. 20
  352. .mH........m.mmH..H.
  353. m....H........H..H..
  354. .........Hm.m.m.....
  355. ....H.H...m.........
  356. .H....m.............
  357. HH.....H.....H.HH...
  358. mmmmmm.H..m..m......
  359. .Hm.H...H.H..m.H....
  360. .........m..m.mHmHH.
  361. ...m.m....m..H.Hm..H
  362. ...Hm....H..m....m..
  363. ...mH.....m.......m.
  364. .H...HmmH..H.....H..
  365. m.H...m.....mmH....H
  366. .m.H......m...H.....
  367. H........m..Hm......
  368. .......m...........m
  369. ...m........m...H...
  370. .........m...H......
  371. HH..H..m...H......H.
  372. */

上面的网上大牛的代码,我看的好像和我的模板差不多,还有测试样例,我就复了一下,下面的是我的代码

Going Home
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 19827   Accepted: 10080

Description

On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point. For each little man, you need to pay a $1 travel fee for every step he moves, until he enters a house. The task is complicated with the restriction that each house can accommodate only one little man.

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.

Input

There
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.

Output

For each test case, output one line with the single integer, which is the minimum amount, in dollars, you need to pay.

Sample Input

  1. 2 2
  2. .m
  3. H.
  4. 5 5
  5. HH..m
  6. .....
  7. .....
  8. .....
  9. mm..H
  10. 7 8
  11. ...H....
  12. ...H....
  13. ...H....
  14. mmmHmmmm
  15. ...H....
  16. ...H....
  17. ...H....
  18. 0 0

Sample Output

  1. 2
  2. 10
  3. 28

Source

 
求得就是每个人需要到每个房子里,一个房子只能装下一个人,问最少的开销,没走一个单元格的花费就以一元
可以直接建图,建出每个人到各个房子的距离,连成一条边,流量cap为1,花费cost为dis,即为横坐标的绝对值差加上纵坐标的绝对值差;
之后建立一个超级原点和一个超级会点,让超级原点连到每一个人,cap为1,cost为0,同理让每一个房子链接到超级汇点,cap为1,cost为0
之后跑框斌的最小费用最大流算法模板就可以过了,还要注意个问题就是总的点数为cnth+cntm+2
还有一个需要注意的地方是本题的范围是100*100;
所以点和边的数值尽量开的大一些
下面贴上代码
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<math.h>
  7. #include<vector>
  8. using namespace std;
  9. //最小费用最大流,求最大费用只需要取相反数,结果取相反数即可。
  10. //点的总数为 N,点的编号 0~N-1
  11. const int MAXN = ;
  12. const int MAXM = ;
  13. const int INF = 0x3f3f3f3f;
  14. struct Edge
  15. {
  16. int to,next,cap,flow,cost;
  17. } edge[MAXM];
  18. int head[MAXN],tol;
  19. int pre[MAXN],dis[MAXN];
  20. bool vis[MAXN];
  21. int N;//节点总个数,节点编号从0~N-1
  22. void init()
  23. {
  24. tol = ;
  25. memset(head,-,sizeof (head));
  26. }
  27. void addedge (int u,int v,int cap,int cost){
  28. edge[tol].to = v;
  29. edge[tol].cap = cap;
  30. edge[tol].cost = cost;
  31. edge[tol].flow = ;
  32. edge[tol].next = head[u];
  33. head[u] = tol++;
  34. edge[tol].to = u;
  35. edge[tol].cap = ;
  36. edge[tol].cost = -cost;
  37. edge[tol].flow = ;
  38. edge[tol].next = head[v];
  39. head[v] = tol++;
  40. }
  41. bool spfa(int s,int t)
  42. {
  43. queue<int>q;
  44. for(int i = ; i < N; i++)
  45. {
  46. dis[i] = INF;
  47. vis[i] = false;
  48. pre[i] = -;
  49. }
  50. dis[s] = ;
  51. vis[s] = true;
  52. q.push(s);
  53. while(!q.empty())
  54. {
  55. int u = q.front();
  56. q.pop();
  57. vis[u] = false;
  58. for(int i = head[u]; i != -; i = edge[i]. next)
  59. {
  60. int v = edge[i]. to;
  61. if(edge[i].cap > edge[i].flow &&
  62. dis[v] > dis[u] + edge[i]. cost )
  63. {
  64. dis[v] = dis[u] + edge[i]. cost;
  65. pre[v] = i;
  66. if(!vis[v])
  67. {
  68. vis[v] = true;
  69. q.push(v);
  70. }
  71. }
  72. }
  73. }
  74. if(pre[t] == -)return false;
  75. else return true;
  76. }
  77. //返回的是最大流,cost存的是最小费用
  78. int minCostMaxflow(int s,int t,int &cost)
  79. {
  80. int flow = ;
  81. cost = ;
  82. while(spfa(s,t))
  83. {
  84. int Min = INF;
  85. for(int i = pre[t]; i != -; i = pre[edge[i^].to])
  86. {
  87. if(Min > edge[i].cap - edge[i]. flow)
  88. Min = edge[i].cap - edge[i].flow;
  89. }
  90. for(int i = pre[t]; i != -; i = pre[edge[i^].to])
  91. {
  92. edge[i].flow += Min;
  93. edge[i^].flow -= Min;
  94. cost += edge[i]. cost * Min;
  95. }
  96. flow += Min;
  97. }
  98. return flow;
  99. }
  100. char map[];
  101. struct node1{
  102. int x, y;
  103. }hh[];
  104. struct node2{
  105. int x,y;
  106. }mm[];
  107. int main(){
  108. int n,m,sta;
  109. while(scanf("%d%d",&n,&m)!=EOF){
  110. if(n==&&m==)
  111. break;
  112. memset(hh,,sizeof(hh));
  113. memset(mm,,sizeof(mm));
  114. memset(map,,sizeof(map));
  115. memset(pre,,sizeof(pre));
  116. memset(dis,,sizeof(dis));
  117. memset(vis,false,sizeof(vis));
  118. memset(edge,,sizeof(edge));
  119. memset(hh,,sizeof(hh));
  120. memset(mm,,sizeof(mm));
  121. init();
  122. int u,v,w;
  123. int cnth=,cntm=;
  124. for(int i=;i<n;i++){
  125. scanf("%s",map);
  126. for(int j=;j<m;j++){
  127. if(map[j]=='H'){
  128. hh[++cnth].x=i;
  129. hh[cnth].y=j;
  130. }
  131. if(map[j]=='m'){
  132. mm[++cntm].x=i;
  133. mm[cntm].y=j;
  134. }
  135. }
  136. }
  137. N=cntm+cnth+;
  138. for(int i=;i<=cntm;i++){
  139. for(int j=;j<=cnth;j++){
  140. addedge(i,j+cntm,,abs(mm[i].x-hh[j].x)+abs(mm[i].y-hh[j].y));
  141. addedge(j+cntm,i,,abs(mm[i].x-hh[j].x)+abs(mm[i].y-hh[j].y));
  142. }
  143. }
  144. int ans1=;
  145. for(int i=;i<=cntm;i++){
  146. addedge(,i,,);
  147. }
  148. for(int j=cntm+;j<=cnth+cntm;j++){
  149. addedge(j,cnth+cntm+,,);
  150. }
  151.  
  152. int temp=minCostMaxflow(,cnth+cntm+,ans1);
  153. printf("%d\n",ans1);
  154.  
  155. }
  156. }

poj 2195 最小费用最大流模板的更多相关文章

  1. POJ - 2195 最小费用最大流

    题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...

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

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

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

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

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

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

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

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

  6. POJ 2135 Farm Tour (最小费用最大流模板)

    题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...

  7. 最小费用最大流模板(POJ 2135-Farm Tour)

    最近正好需要用到最小费用最大流,所以网上就找了这方面的代码,动手写了写,先在博客里存一下~ 代码的题目是POJ2135-Farm Tour 需要了解算法思想的,可以参考下面一篇文章,个人觉得有最大流基 ...

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

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

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

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

随机推荐

  1. POJ Charm Bracelet 挑饰品 (常规01背包)

    问题:去珠宝店抢饰品,给出饰品种数n,能带走的重量m,以及每种饰品的重量w与价值v.求能带走的最大量. 思路:常规01背包. #include <iostream> using names ...

  2. linux概念和体系

    1. Linux开机启动 2. Linux文件管理 3. Linux的架构 4. Linux命令行与命令 5. Linux文件管理相关命令 6. Linux文本流 7. Linux进程基础 8. Li ...

  3. 【Apache】HTTPD 2.4.37 + OpenSSL 1.1.1 企业级安全配置(含TLS修复)

    我为什么要写这一篇稿子? 为了避免更多的运维.开发者没能实现企业的信息安全,我将共享出我个人的HTTPD的安全修复(2.2和2.4差不太多就看2.4就好) 起因:我为某M工作,但因某M和testin合 ...

  4. Python3之偏函数

    通过设定参数的默认值,可以降低函数调用的难度.偏函数可以做到这一点 int()函数可以把字符串转换成十进制整数,当传入字符串时,int()默认把字符串为十进制 >>> int('12 ...

  5. JS编程规范指南

    原文:github.com/ryanmcdermott/clean-code-javascript 说明:本文翻译自 github 上的一个项目,只取部分精华. 一.变量 用有意义且常用的单词命名 / ...

  6. k8s1.13.0二进制部署-ETCD集群(一)

    Kubernetes集群中主要存在两种类型的节点:master.minion节点. Minion节点为运行 Docker容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能.Ma ...

  7. $|^|\z|\Z|/a|/l

    #!/usr/bin/perl use strict; use warnings; foreach(<>) { if (/(\w*)/a){print "$1\n";} ...

  8. mysql crash cource 书中实例

    样例表 CREATE TABLE customers(  cust_id      int       NOT NULL AUTO_INCREMENT,  cust_name    char(50)  ...

  9. 利用SignalR实现实时聊天

    2018/10/10:博主第一次写原创博文而且还是关于C#的(博主是从前端转过来的),菜鸟一枚,如果有什么写的不对,理解错误,还望各位轻喷.,从SignalR开始! 首先先介绍一下关于SignalR的 ...

  10. textContent和innerText属性的区别

    原文摘自 textContent和innerText属性的区别 <!DOCTYPE html> <html> <head> <meta charset=&qu ...