HDU 4862
http://acm.hdu.edu.cn/showproblem.php?pid=4862
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <queue>
- using namespace std ;
- const int INF=0xfffffff ;
- struct node{
- int s,t,cap,cost,nxt ;
- }e[] ;
- int sumflow ;
- int cnt,head[],vis[],dis[],pre[] ;
- void add(int s,int t,int cap,int cost)
- {
- e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
- e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap= ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
- }
- int spfa(int s,int t,int N)
- {
- for(int i= ;i<=N ;i++)
- dis[i]=INF ;
- dis[s]= ;
- memset(vis,,sizeof(vis)) ;
- memset(pre,-,sizeof(pre)) ;
- vis[s]= ;
- queue <int> q ;
- q.push(s) ;
- while(!q.empty())
- {
- int u=q.front() ;
- q.pop() ;
- vis[u]= ;
- for(int i=head[u] ;i!=- ;i=e[i].nxt)
- {
- int tt=e[i].t ;
- if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
- {
- dis[tt]=dis[u]+e[i].cost ;
- pre[tt]=i ;
- if(!vis[tt])
- {
- vis[tt]= ;
- q.push(tt) ;
- }
- }
- }
- }
- if(dis[t]==INF)return ;
- return ;
- }
- int mincost ;
- int MCMF(int s,int t,int N)
- {
- int flow,minflow ;
- mincost=flow= ;
- while(spfa(s,t,N))
- {
- minflow=INF ;
- for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
- minflow=min(minflow,e[i].cap) ;
- flow+=minflow ;
- for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
- {
- e[i].cap-=minflow ;
- e[i^].cap+=minflow ;
- }
- mincost+=dis[t]*minflow ;
- }
- sumflow=flow ;//最大流
- return sumflow ;
- }
- char g[][] ;
- int gm[][] ;
- int main()
- {
- int T ;
- scanf("%d",&T) ;
- for(int cas= ;cas<=T ;cas++)
- {
- cnt= ;
- memset(head,-,sizeof(head)) ;
- int N,M,K ;
- scanf("%d%d%d",&N,&M,&K) ;
- for(int i= ;i<N ;i++)
- scanf("%s",g[i]) ;
- int S,T,V ;
- S= ;T=*N*M+ ;V=T+ ;
- add(S,V,K,) ;
- for(int i= ;i<=N*M ;i++)
- {
- add(S,i,,) ;
- add(i+N*M,T,,) ;
- add(V,i+N*M,,) ;
- }
- int ct= ;
- for(int i= ;i<N ;i++)
- {
- for(int j= ;j<M ;j++)
- {
- gm[i][j]=ct++ ;
- }
- }
- for(int i= ;i<N ;i++)
- {
- for(int j= ;j<M ;j++)
- {
- for(int k=j+ ;k<M ;k++)
- {
- if(g[i][j]==g[i][k])
- {
- add(gm[i][j],gm[i][k]+N*M,,-(g[i][j]-''-(k-j-))) ;
- }
- else
- {
- add(gm[i][j],gm[i][k]+N*M,,k-j-) ;
- }
- }
- for(int k=i+ ;k<N ;k++)
- {
- if(g[i][j]==g[k][j])
- {
- add(gm[i][j],gm[k][j]+N*M,,-(g[i][j]-''-(k-i-))) ;
- }
- else
- {
- add(gm[i][j],gm[k][j]+N*M,,k-i-) ;
- }
- }
- }
- }
- printf("Case %d : ",cas) ;
- if(MCMF(S,T,*N*M+)==N*M)
- printf("%d\n",-mincost) ;
- else puts("-1") ;
- }
- return ;
- }
最小k路径覆盖模型,解法是建二分图求最优匹配
建图如下,重点是V点的建立,这个点和S点连容量k费用0的边和拆的另一半点连容量1费用0的边,可以保证小于等于k次完成(每次匹配一定要消耗S-V的一个单位流量,因为如果不消耗匹配不会停止,这是这个模型建图的最精髓之处),别的点就是正常的费用流求二分图最优匹配的建图方法,最后看求出的最大流是否等于N*M,等于证明有解
HDU 4862的更多相关文章
- hdu 4862 KM算法 最小K路径覆盖的模型
http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...
- HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)
职务地址:pid=4862">HDU4862 最小费用流做的还是太少. 建图想不出来. . . 直接引用官方题解的话吧... 最小K路径覆盖的模型.用费用流或者KM算法解决,构造二部图 ...
- HDU 4862 Jump(最小K路径覆盖)
输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...
- HDU 4862(费用流)
Problem Jump (HDU4862) 题目大意 给定一个n*m的矩形(n,m≤10),每个矩形中有一个0~9的数字. 一共可以进行k次游戏,每次游戏可以任意选取一个没有经过的格子为起点,并且跳 ...
- 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...
- HDU 4862 Jump 费用流
又是一个看了题解以后还坑了一天的题…… 结果最后发现是抄代码的时候少写了一个负号. 题意: 有一个n*m的网格,其中每个格子上都有0~9的数字.现在你可以玩K次游戏. 一次游戏是这样定义的: 你可以选 ...
- HDU 4862 Jump 任意起点最大权K链不相交覆盖
你可以从任意起点开始起跳最多K次 每次跳你可以选择往右或者往下跳 从(x1,y1)跳到(x2,y2) 消耗的能量是曼哈顿距离-1 但是如果每次跳的起点和终点格子里的数字是相同的为X的话你会得到X能量 ...
- HDU 4862 JUMP 最小费用最大流
2014 多校的B题,由于我不怎么搞图论,当时碰到这个题目,我怎么想都没往网络流方面弄,不过网络流真的是个好东西,对于状态多变,无法用动规或者数据结构来很好表示的时候,非常有用 这个题目要求每个点一定 ...
- HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1134 [解题背景]这题不会做,自己推公式推了一段时间,将n=3和n=4的情况列出来了,只发现第n项与 ...
随机推荐
- Android本地广播
Android中使用的广播一般是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播.这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数 ...
- 利用JSP中的过滤器解决中文乱码问题
首先我们创建过过滤器: package com.gbx; import java.io.IOException; import javax.servlet.Filter; import javax.s ...
- SQL Insert Case When Update
CREATE TABLE LoadTestTable ( ID INT IDENTITY(1,1), FIRSTNAME VARCHAR(50), LASTNAME VARCHAR(50), GEND ...
- MongoDB(课时12 字段判断)
3.4.2.7 判断某个字段是否存在 使用“$exists”可以判断某个字段是否存在,如果设置为true表示存在,false表示不存在. 范例:查询具有parents成员的数据 db.students ...
- DrawDibDraw__ZC测试
ZC: 先把 自己尝试成功的代码 记录下来,不要 弄没了之后 又忘了怎么弄... ZC: 代码 有点乱,没整理.没写 哪些是 原来MFC里面的 哪些是我自己写的,参考上一篇文章来看吧 1.VC6 的一 ...
- ZendFramework中实现自动加载models
最近自学Zendframework中,写Controller的时候总要require model下的类文件,然后才能实例化,感觉非常不爽 Google了许久,找到个明白人写的方法不错,主要就是修改ap ...
- English trip -- VC(情景课)2 D Reading
Xu言: 业精于勤,荒于嬉:行成于思,毁于随 Before you read 阅读准备 Talk about the picture, what do you see?看图说话,你看到了什么? Lis ...
- Connected Components? CodeForces - 920E (bfs)
大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iost ...
- gradle 编译 No such property: sonatypeUsername错误解决
No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...
- 『PyTorch』第七弹_nn.Module扩展层
有下面代码可以看出torch层函数(nn.Module)用法,使用超参数实例化层函数类(常位于网络class的__init__中),而网络class实际上就是一个高级的递归的nn.Module的cla ...