poj3422 Kaka's Matrix Travels(最小费用最大流问题)

  1 /*
  2 poj3422 Kaka's Matrix Travels 
  3 不知道 k次 dp做为什么不对???
  4 看了大牛的代码,才知道还可以这样做! 
  5 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序一直陷入死循环,真心花了好长时间,快崩溃了。无语..... 
  6 题意:有个方阵,每个格子里都有一个非负数,从左上角走到右下角,每次走一步,只能往右或往下走,经过的数字拿走 
  7 每次都找可以拿到数字和最大的路径走,走k次,求最大和 
  8  
  9 这是 最大费用最大流 问题  每次spfa都找的是一条和最大的路径 s--到左上角的边流量是K限制增广次数 
 10  
 11 求最大费用最大流只需要把费用换成相反数,用最小费用最大流求解即可 
 12  
 13  
 14 构图过程:
 15 每个点拆分成两个  a   a'   之间建两条边(当然还要建退边),分别是   (费用为该点相反数,流量为1) (费用为0,流量为k-1) 
 16 路过这点时,可以通过前边那条边拿到数字, 
 17 以后再从这儿过,就没有数字可拿了,走的就是第二条边 
 18  
 19 然后是 没点向 右和下 建一条边  费用0,流量k 
 20 */
 21 #include<iostream>
 22 #include<queue>
 23 #include<cstring>
 24 #include<cstdio> 
 25 #define N 50000
 26 #define M 5005
 27 #define Max 0x3f3f3f3f
 28 using namespace std;
 29 class EDGE
 30 {
 31 public:
 32    int u, v, c, f;
 33    int next;
 34 };
 35 queue<int>q; 
 36 EDGE edge[N];
 37 int cap[55][55], n, k;
 38 int pre[N], first[N];
 39 int dist[M], vis[M];
 40 int edgeN;
 41 int s, t;
 42 int maxFlow;
 43 
 44 int spfa()
 45 {
 46     memset(dist, 0x3f, sizeof(dist));
 47     memset(vis, 0, sizeof(vis));
 48     memset(pre, -1, sizeof(pre));
 49     dist[s]=0;
 50     q.push(s);
 51     vis[s]=1;
 52     while(!q.empty())
 53     {
 54         int u=q.front();
 55         q.pop();
 56         vis[u]=0;
 57         for(int e=first[u]; e!=-1; e=edge[e].next)
 58         {
 59           int v=edge[e].v; 
 60           if(dist[v]>dist[u] + edge[e].c && edge[e].f>0)
 61            {
 62                dist[v]=dist[u] + edge[e].c;
 63                pre[v]=e;
 64                if(!vis[v])
 65                {
 66                      vis[v]=1;
 67                      q.push(v);
 68            }
 69        }
 70     } 
 71      }
 72      if(dist[t]==Max)
 73        return 0;
 74      return 1;
 75 }
 76 
 77 void updateFlow()
 78 {
 79    int minF=Max;
 80    for(int e=pre[t]; e!=-1; e=pre[edge[e].u])
 81      if(minF>edge[e].f)
 82         minF=edge[e].f;
 83    for(int e=pre[t]; e!=-1; e=pre[edge[e].u])
 84    {
 85       edge[e].f-=minF;
 86       edge[e^1].f+=minF;
 87       maxFlow+=minF*edge[e].c;
 88    }
 89 }
 90 
 91 void adde(int u, int v, int c, int f)
 92 {
 93     edge[edgeN].u=u; edge[edgeN].v=v;
 94     edge[edgeN].c=c; edge[edgeN].f=f;
 95     edge[edgeN].next=first[u]; first[u]=edgeN++;
 96     
 97     edge[edgeN].u=v; edge[edgeN].v=u;
 98     edge[edgeN].c=-c; edge[edgeN].f=0;
 99     edge[edgeN].next=first[v]; first[v]=edgeN++;
100 }
101 
102 int main()
103 {
104    int i, j;
105    while(scanf("%d%d", &n, &k)!=EOF)
106    {
107       maxFlow=0;
108       edgeN=0;
109       memset(first, -1, sizeof(first));
110       s=0; t=n*n*2+1;
111       for(i=1; i<=n; ++i)
112         for(j=1; j<=n; ++j)
113           scanf("%d", &cap[i][j]);
114       adde(s, 1, 0, k);
115       for(i=1; i<=n; ++i)
116         for(j=1; j<=n; ++j)//n*n个节点,拆点之后变成2*n*n个节点 
117         {
118            int nb=(i-1)*n+j;
119            adde(2*nb-1, 2*nb, -cap[i][j], 1);//注意:a到a`是建立两条边,但是两条边的费用和容量不一样 
120            adde(2*nb-1, 2*nb, 0, k-1);
121            if(j<n)//向右建图 
122              adde(2*nb, 2*(nb+1)-1, 0, k);
123            if(i<n)//向下建图 
124              adde(2*nb, 2*(nb+n)-1, 0, k);
125     }
126        adde(n*n*2, t, 0, k);
127        
128        while(spfa())//建好图之后,直接调用最小费用最大流模板就好了 
129           updateFlow();
130        printf("%d\n", -maxFlow);
131    }
132    return 0;
133 }

 

转载于:https://www.cnblogs.com/hujunzheng/p/3798997.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java把对象转成图片格式转换器安卓版,java 万能图片格式转换

话不多说&#xff0c;直接上代码import java.awt.image.BufferedImage;import java.awt.image.Raster;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;public class IOUtil {public static void pgm2png(String src, String dest) throws IOExc…

hadooppythonsql_python - hadoop,mapreduce demo

Hadoop,mapreduce 介绍59888745qq.com大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽)&#xff0c;把用户的交易或行为信息通过HDFS(分布式文件系统)等存储用户数据文件&#xff0c;然后通过Hbase(类似于NoSQL)等存储数据&#xff0c…

hdu 2896 病毒侵袭 ac自动机

1 /*2 hdu 2896 病毒侵袭 ac自动机 3 从题意得知&#xff0c;模式串中没有重复的串出现&#xff0c;所以结构体中可以将last[]&#xff08;后缀链接&#xff09;数组去掉 4 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 。本题中主要是计算每一个模式串5 在主串中有没…

axure原件 总是丢失_Axure实现提示文本单击显示后自动消失的效果

FORM一 .新增的input输入属性 1.email类型 在表单提交E-mail地址时,无效的输入会生成很多无效数据,对后期的数据检索造成一定的影响.所以在表单提交之前,需要对输入的E-mail地址进行有效 ...Google的Protobuf协议分析protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文…

linux php不能写文件内容,php 在linux系统下写出文件问题

最近写了一个简单的生成文件&#xff0c;服务器用的linux 但是在将文件写出到路径的时候就会写出一个其他的文件夹其中一些代码如下define("paddy",dirname(__FILE__));$gkrequest_uri();$filepathpaddy.$gk&#xff1b;createfile($filefath,$file)&#xff1b;//$f…

python mysql删除数据_python-mysql删除和更新数据

删除数据import codecsimport MySQLdbdef connect_mysql():db_config {host: 192.168.48.128,port: 3306,user: xiang,passwd: 123456,db: python,charset: utf8}cnx MySQLdb.connect(**db_config)return cnxif __name__ __main__:cnx connect_mysql()sql select * from S…

xlat指令...

1 ;就是一个串str1&#xff0c; lea ebx, str1 然后我们ebx1总是加上的是一个字节&#xff0c; 无论&#xff08;串是word&#xff0c; byte&#xff0c; dword&#xff09;2 .3863 .model flat4 .stack 40965 include io.h6 ExitProcess proto near32 stdcall, deExitCode:dwo…

php 串口通信例程,HAL库串口通信例程

请问下 为什么要 用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个函数呢?不用不行吗&#xff1f;static void MX_USART1_UART_Init(void){huart1.Instance USART1;huart1.Init.BaudRate 9600;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.Stop…

char 类型与lpcwstr_「lpctstr」char* 与 LPCTSTR 类型的互相转换 - seo实验室

lpctstr1.char* 转换成 LPCTSTRchar ch[1024] "wo shi ni baba";int num MultiByteToWideChar(0,0,ch,-1,NULL,0);wchar_t *wide new wchar_t[num];MultiByteToWideChar(0,0,ch,-1,wide,num);解析&#xff1a;num 获得长字节所需的空间MultiByteToWideChar()表示将…

poj 2195 Going Home

1 /*2 做网络流的题建图真的是太重要了&#xff01;3 本题是将人所在的位置和房子所在的位置建立边的联系&#xff0c;其中man到house这一条边的流量为 1&#xff0c; 费用为两者的距离4 而方向边的流量为 0&#xff0c; 费用为正向边的相反数&#xff08;也就是沿着反…

CardLayout布局练习(小的图片浏览器)

1 /*2 涉及Panel中的图片的加载&#xff0c;还有Frame的关闭的方法&#xff0c; CardLayout&#xff08;int hgap, int vgap&#xff09;就会决定卡片面板的大小3 匿名类的使用。。。4 */5 import java.awt.*;6 import java.awt.event.*;7 import javax.swing.*;8 public class…

python求逆矩阵的方法,Python 如何求矩阵的逆

我就废话不多说了&#xff0c;大家还是直接看代码吧~import numpy as npkernel np.array([1, 1, 1, 2]).reshape((2, 2))print(kernel)print(np.linalg.inv(kernel))注意&#xff0c;Singular matrix奇异矩阵不可求逆补充&#xff1a;pythonnumpy中矩阵的逆和伪逆的区别定义&a…

plsql存过声明游标_plsql编程学习之游标一

oralce plsql编程的游标游标分类1显示游标2隐式游标隐式游标&#xff0c;oracle自动管理&#xff0c;不用声明&#xff0c;打开和关闭&#xff0c;ORACLE自动处理&#xff0c;使用隐式游标%FOUND时&#xff0c;需要加上 SQL%FOUND显示游标&#xff0c;需要自己声明&#xff0c;…

用命令行编译java并生成可执行的jar包

用命令行编译java并生成可执行的jar包 1.编写源代码。 编写源文件&#xff1a;CardLayoutDemo.java并保存&#xff0c;例如&#xff1a;I:\myApp\CardLayoutDemo.java。程序结构如下&#xff1a;package test;import java.awt.*; import javax.swing.*; //更多包的导入...clas…

python计时器单位,python(计时器)

计时器要求&#xff1a;定制一个计时器的类start 和 stop方法代表启动计时和停止计时假设计时器对象 t1&#xff0c;print(t1)和直接调用t1 均显示结果当计时器未启动或已停止计时&#xff0c;调用stop方法能给予温馨提示两个计时器对象可以相加&#xff1a; t1 t2只能使用提供…

查询分析300万笔记录_给你100万条数据的一张表,你将如何查询优化?

1.两种查询引擎查询速度(myIsam 引擎)InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多少行。MyISAM只要简单的读出保存好的行数即可。注意的是&#xff0c;当count(*)语句包含 whe…

poj 3321 Apple Trie

/*poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题&#xff01;可以利用dfs&#xff08;&#xff09;来搞定&#xff0c;我们在对一个节点深搜后&#xff0c;所经过的节点的数目就是该节点的子树的数目所以我们利用start[i]数组来记录 i 节…

php美团项目分享,美团项目(纯代码)(示例代码)

一.框架搭建1.icon规格要求可从文档中查找,搜索app icon.2.因为很多界面重复利用,所以不用storyboarda.删除stroyboard,在设置中Info -> Main storyboard file base name 项直接去除b.创建ZXHomeViewController(UICollectionViewController)和ZXNavigationController(UINavi…

ioc spring 上机案例_Spring的IoC入门案例

1、创建工程&#xff0c;导入坐标1.1 创建工程1.2 导入坐标xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.examplespring_01_io…

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...

1 /*2 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中&#xff0c;3 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的&#xff0c;而原构造函数中的代码则移到了构造函数的最后执行4 */5 import static java.lang.System.out;6 7 public clas…