POJ 3422 Kaka's Matrix Travels 【最小费用最大流】
题意:
卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下。矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和。
思路:
最小费用最大流的题目。
建图自己没想出来,看了大神的建边,把每个点分解成两个点,一个代表进入一个代表出去,然后每个进入和每个出去连边,容量是1价值是这个点的矩阵的数值。然后因为可以不进去,所以起点要和别的矩阵元素的起点建边,终点也要和别的矩阵矩阵元素的起点建边,最后跑下最小费用最大流。
这题最右下角的矩阵元素需要特殊处理下.然后源点和左上角的矩阵元素的起点连边,容量为k,权值是0.
- #include<stdio.h>
- #include<queue>
- #define MAXN 6003
- #define MAXM 10002*4
- #define INF 10000000
- using namespace std;
- //起点编号必须最小,终点编号必须最大
- bool vis[MAXN]; //spfa中记录是否在队列里边
- struct edge{
- edge *next,*op; //op是指向反向边
- int t,c,v; //t下一个点编号,c容量,v权值
- }ES[MAXM],*V[MAXN]; //ES边静态邻接表,V点的编号
- int N,M,S,T,EC=-; //S源点最小,T汇点最大,EC当前边数
- int demond[MAXN],sp[MAXN],prev[MAXN]; //spSPFA中记录距离,prev记录上一个点路径
- edge *path[MAXN]; //与prev同步记录,记录到上一条边
- void addedge(int a,int b,int v,int c=INF){
- edge e1={V[a],,b,c,v},e2={V[b],,a,,-v};
- ES[++EC]=e1;V[a]=&ES[EC];
- ES[++EC]=e2;V[b]=&ES[EC];
- V[a]->op=V[b];V[b]->op=V[a];
- }
- void init(){
- int n,k;
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;i++)
- for(int j=;j<=n;j++){
- int tmp;
- scanf("%d",&tmp);
- addedge((i-)*n+j,n*n+(i-)*n+j,-tmp,);
- if(j<n){
- addedge(n*n+(i-)*n+j,(i-)*n+j+,);
- addedge((i-)*n+j,(i-)*n+j+,);
- }
- if(i<n){
- addedge(n*n+(i-)*n+j,i*n+j,);
- addedge((i-)*n+j,i*n+j,);
- }
- }
- S=,T=n*n*+;
- addedge(n*n,T,);
- addedge(S,,,k);
- addedge(n*n*,T,);
- }
- bool SPFA(){
- int u,v;
- for(u=S;u<=T;u++){
- sp[u]=INF;
- }
- queue<int>q;
- prev[S]=-;
- q.push(S);
- sp[S]=;
- vis[S]=;
- while(!q.empty()){
- u=q.front();
- vis[u]=;
- q.pop();
- for(edge *k=V[u];k;k=k->next){
- v=k->t;
- if(k->c>&&sp[u]+k->v<sp[v]){
- sp[v]=sp[u]+k->v;
- prev[v]=u;
- path[v]=k;
- if(vis[v]==){
- vis[v]=;
- q.push(v);
- }
- }
- }
- }
- return sp[T]!=INF;
- }
- int argument(){
- int i,cost=INF,flow=;
- edge *e;
- for(i=T;prev[i]!=-;i=prev[i]){
- e=path[i];
- if(e->c<cost)cost=e->c;
- }
- for(int i=T;prev[i]!=-;i=prev[i]){
- e=path[i];
- e->c-=cost;e->op->c+=cost;
- flow+=e->v*cost;
- }
- return flow;
- }
- int maxcostflow(){
- int Flow=;
- while(SPFA()){
- Flow+=argument();
- }
- return Flow;
- }
- int main(){
- init();
- printf("%d\n",-maxcostflow());
- return ;
- }
POJ 3422 Kaka's Matrix Travels 【最小费用最大流】的更多相关文章
- [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...
- POJ 3422 Kaka's Matrix Travels(费用流)
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6792 Accepted: ...
- POJ 3422 Kaka's Matrix Travels
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9567 Accepted: ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
/* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...
- POJ 3422 Kaka's Matrix Travels(最小费用最大流)
http://poj.org/problem?id=3422 题意 : 给你一个N*N的方格,每个格子有一个数字,让你从左上角开始走,只能往下往右走,走过的数字变为0,走K次,问最大能是多大,累加的. ...
- POJ 3422 Kaka's Matrix Travels (K取方格数:最大费用流)
题意 给出一个n*n大小的矩阵,要求从左上角走到右下角,每次只能向下走或者向右走并取数,某位置取过数之后就只为数值0,现在求解从左上角到右下角走K次的最大值. 思路 经典的费用流模型:K取方格数. 构 ...
- poj 3422 Kaka's Matrix Travels 费用流
题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...
- POJ 3422 Kaka's Matrix Travels(拆点+最大费用流)题解
题意:小A从左上角走到右下角,每个格子都有一个价值,经过这个格子就把价值拿走,每次只能往下或往右走,问你走k次最多能拿多少价值的东西. 思路:这里有一个限制条件就是经过之后要把东西拿走,也就是每一格的 ...
- POJ 3422 Kaka's Matrix Travels K取方格数
题目:给出n*n的方格矩阵,现在从左上方走m次到右下方,问m次能够获得的最大价值和. 分析:最大费用流.拆点进行限制每个格子只取一次,假设点x拆成 x,xx,右边(假设有)y,yy,下方(假设有)z, ...
随机推荐
- jQuery Mobile_公司简介
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- CSS 使用小结
1.文字过长显示省略号(....) white-space: nowrap;overflow: hidden;text-overflow: ellipsis; 2.获取当前的ID : <asp ...
- 解压jar
unzip EtnetChinaApplication.jar -d app进入临时目录app,编辑文件
- oracle 自定义异常处理
--第一种方式:使用raise_application_error抛出自定义异常declare i number:=-1;begin if i=-1 then raise_application_er ...
- [nginx]Nginx禁止访问robots.txt防泄漏web目录
关于robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息.您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网 ...
- [原]对Linux环境下任务调度一点认识
我一直以来有一个误解,那就是在终端运行某个程序时,按下Ctrl + D时我误以为就是杀死了这个进程,今天才知道原来不是.比如我利用libevent在Linux环境下写了一个网络监听程序,当启动程序之后 ...
- 03 在Linux下安装Myeclipse及Tomcat(含下载)
测试环境: 主机系统:Win 7 虚拟机:VMware workstation 11.1.0 虚拟机OS: centos 6.5 64位 Kernel 2.6.32-431-e16.x86_64 My ...
- 个人卡付款sql
select arap_djfb.billdate as 单据日期, bd_corp.unitname as 付款单位, arap_djfb.zy as 付款摘要, bd_cubasdoc.custc ...
- (VS TFS) Adding existing project to solution in TFS.
正常的情况话,直接加入project,然后选择"Source control" -> “Add selected projects to source control.... ...
- Platform Invoke
PInvoke 允许managed code 来调用在DLL中实施的unmanged function. Platform invoke relies on metadata to locate ex ...