HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)
最小费用流做的还是太少。
建图想不出来。
。
。
直接引用官方题解的话吧。。。
最小K路径覆盖的模型。用费用流或者KM算法解决,构造二部图,X部有N*M个节点。源点向X部每一个节点连一条边,流量1,费用0,Y部有N*M个节点,每一个节点向汇点连一条边。流量1,费用0。假设X部的节点x能够在一步之内到达Y部的节点y,那么就连边x->y,费用为从x格子到y格子的花费能量减去得到的能量。流量1,再在X部添加一个新的节点,表示能够从随意节点出发K次,源点向其连边,费用0。流量K。这个点向Y部每一个点连边,费用0,流量1,最这个图跑最小费用最大流,假设满流就是存在解。反之不存在,最小费用的相反数就是能够获得的最大能量
代码例如以下:
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- #include <ctype.h>
- #include <queue>
- #include <map>
- #include<algorithm>
- using namespace std;
- const int INF=0x3f3f3f3f;
- int head[500], source, sink, cnt, flow, cost;
- int cur[500], d[500], vis[500], mp[20][20];
- struct node
- {
- int u, v, cap, cost, next;
- } edge[1000000];
- void add(int u, int v, int cap, int cost)
- {
- edge[cnt].v=v;
- edge[cnt].cap=cap;
- edge[cnt].cost=cost;
- edge[cnt].next=head[u];
- head[u]=cnt++;
- edge[cnt].v=u;
- edge[cnt].cap=0;
- edge[cnt].cost=-cost;
- edge[cnt].next=head[v];
- head[v]=cnt++;
- }
- int spfa()
- {
- memset(d,INF,sizeof(d));
- memset(vis,0,sizeof(vis));
- queue<int>q;
- q.push(source);
- d[source]=0;
- cur[source]=-1;
- int minflow=INF, i;
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- vis[u]=0;
- for(i=head[u]; i!=-1; i=edge[i].next)
- {
- int v=edge[i].v;
- if(d[v]>d[u]+edge[i].cost&&edge[i].cap)
- {
- d[v]=d[u]+edge[i].cost;
- minflow=min(minflow,edge[i].cap);
- cur[v]=i;
- if(!vis[v])
- {
- vis[v]=1;
- q.push(v);
- }
- }
- }
- }
- if(d[sink]==INF) return 0;
- flow+=minflow;
- cost-=minflow*d[sink];
- for(i=cur[sink]; i!=-1; i=cur[edge[i^1].v])
- {
- edge[i].cap-=minflow;
- edge[i^1].cap+=minflow;
- }
- return 1;
- }
- void mcmf(int sum)
- {
- while(spfa());
- if(flow==sum)
- printf("%d\n",cost);
- else
- printf("-1\n");
- }
- int main()
- {
- int t, n, m, i, j, k, h, num=0;
- char s[30];
- scanf("%d",&t);
- while(t--)
- {
- num++;
- scanf("%d%d%d",&n,&m,&k);
- for(i=0; i<n; i++)
- {
- scanf("%s",s);
- for(j=0; j<m; j++)
- {
- mp[i][j]=s[j]-'0';
- }
- }
- source=0;
- sink=2*n*m+2;
- cnt=0;
- memset(head,-1,sizeof(head));
- flow=0;
- cost=0;
- for(i=1; i<=n*m; i++)
- {
- add(source,i,1,0);
- add(i+n*m+1,sink,1,0);
- add(n*m+1,i+n*m+1,1,0);
- }
- add(source,n*m+1,k,0);
- int z;
- for(i=0; i<n; i++)
- {
- for(j=0; j<m; j++)
- {
- for(h=j+1; h<m; h++)
- {
- z=0;
- if(mp[i][j]==mp[i][h])
- z=mp[i][j];
- add(i*m+j+1,n*m+1+i*m+h+1,1,h-j-1-z);
- }
- for(h=i+1; h<n; h++)
- {
- int z=0;
- if(mp[i][j]==mp[h][j])
- z=mp[i][j];
- add(i*m+j+1,n*m+1+h*m+j+1,1,h-i-1-z);
- }
- }
- }
- printf("Case %d : ",num);
- mcmf(n*m);
- }
- return 0;
- }
版权声明:本文博主原创文章。博客,未经同意不得转载。
HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)的更多相关文章
- HDU 4864Task(更多的联合培训学校1)(贪婪)
职务地址:pid=4864">HDU4864 这题又是一上来觉得是最小费用流,可是边太多.果然,敲完交上去后不断TLE.. 小优化了两次也没过. . . sad.. 后来看了题解才发现 ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the 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 4494 Teamwork 最小费用最大流
Teamwork Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4494 ...
- 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 2686&&hdu 3376(拆点+构图+最小费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
随机推荐
- SVGALib
SVGALib是一套运行于Linux及FreeBSD下的开放源代码低阶绘图函式库,它允许程式设计人员变更视讯模式及全屏幕图像,许多热门的电脑游戏如Quake及Doom都源自此技术. 范例 编辑 #in ...
- JavaScript中双叹号“!!”作用
1.JavaScript的逻辑非(!)操作符的作用 (逻辑非) 如果操作数能够转换为true则返回false:否则返回true. 2.!!的作用 !!一般用来将后面的表达式强制转换为布尔类型的数据(b ...
- LA 3026 - Period KMP
看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- [慕课笔记] node+mongodb建站攻略
如何利用node+mongodb来快速搭建一个电影网站? 一:后端部分 整个网站的后端是由node.js来驱动的,所以在后端需要安装node.js,以及在这个基础之上的框架express,它能够帮助我 ...
- RISC-V工具链环境(基于Debian/Linux操作系统)
RISC-V工具链环境(基于Debian/Linux操作系统) 提要 Debian/Linux虚拟机导入 启动虚拟机 SiFive/Nuclei SDK运行指南 Debian/Linux虚拟机存储位置 ...
- UI组件之AdapterView及其子类关系,Adapter接口及事实上现类关系
AdapterView本身是一个抽象基类,它派生的的子类在使用方法上十分类似.AdapterView直接派生的三个子类:AbsListView.AbsSpinner,AdapterViewAnimat ...
- eclipse调试鼠标放上去显示变量值
在eclipse中调试时,鼠标移动到变量上不显示值,这个原来自己也遇到过,没注意,反正就使用ctrl+shift+i嘛,也可以的,刚查了一下,解决方法如下: Window->Preference ...
- wikioi 1051哈希表
题目描写叙述 Description 给出了N个单词,已经按长度排好了序.假设某单词i是某单词j的前缀,i->j算一次接龙(两个同样的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙 ...
- ZOJ 3204 Connect them 继续MST
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 题目大意: 让你求最小生成树,并且按照字典序输出哪些点连接.无解输出-1 ...
- https://github.com/mvf/svn_wfx
https://github.com/mvf/svn_wfx 2003.net对应的vc是7.0版本.需要更高的. 在哪里可以下载呢 https://www.tjupt.org/没有校外种子 Proj ...