【POJ3422】Kaka's Matrix Travels
时间:2021-08-03
本文章向大家介绍【POJ3422】Kaka's Matrix Travels,主要包括【POJ3422】Kaka's Matrix Travels使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
解析:
由于一个点可以走多次,而且第二次走没有分数,考虑拆点。每个点到它拆出来的点连两条边,一条的容量设成1,费用设为该格子分数的相反数。表示,这条边只能走一次,且走这条边能拿到分数;第二条的容量设成无穷大,费用设成\(0\),表示,这个格子可以重复走,但是没有分数。然后在拆出来的点和它能到的点连边,容量无穷大,费用为\(0\)就可以了。最后费用流增广\(k\)次,得到的最小费用的相反数即为最大值。
code:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int Maxn=5005;
const int Maxm=100005;
const int inf=1e9;
int n,m,size=-1,s,t,k,sum;
int dis[Maxn],first[Maxn],v[Maxn],tmp[Maxn];
struct shu{int to,next,l,c;}e[Maxm<<1];
inline int get_int()
{
int x=0,f=1;char c;
while(!isdigit(c) && c!='-') c=getchar();
if(c=='-') f=-1,c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
inline int min(int x,int y){return x>y ? y : x;}
inline void add(int x,int y,int l,int c)
{
e[++size].next=first[x],first[x]=size,e[size].to=y,e[size].l=l,e[size].c=c;
e[++size].next=first[y],first[y]=size,e[size].to=x,e[size].l=0,e[size].c=-c;
}
inline void init()
{
n=get_int(),k=get_int(),t=n*n*2+1;
int len=n*n,x,pos;
for(int i=s;i<=t;i++) first[i]=-1;
for(int i=0;i<n;i++)
for(int j=1;j<=n;j++)
{
x=get_int(),pos=i*n+j;
add(pos,len+pos,1,-x),add(pos,len+pos,len,0);
if(i<n-1) add(len+pos,pos+n,len,0);
if(j<n) add(len+pos,pos+1,len,0);
}
add(s,1,inf,0),add(t-1,t,inf,0);
}
inline bool spfa()
{
queue<int>q;
for(int i=s;i<=t;i++) dis[i]=inf,tmp[i]=first[i];
q.push(s),v[s]=1,dis[s]=0;
while(!q.empty())
{
int p=q.front();q.pop(),v[p]=0;
for(register int u=first[p];~u;u=e[u].next)
{
int to=e[u].to;
if(!e[u].l || dis[to]<=dis[p]+e[u].c) continue;
dis[to]=dis[p]+e[u].c;
if(!v[to]) v[to]=1,q.push(to);
}
}
return dis[t]!=inf;
}
inline int dfs(int p,int flow)
{
if(p==t) return flow;
int s=0;v[p]=1;
for(register int &u=tmp[p];~u;u=e[u].next)
{
int to=e[u].to;
if(!e[u].l || dis[to]!=dis[p]+e[u].c || v[to]) continue;
int minn=dfs(to,min(flow-s,e[u].l));
e[u].l-=minn,e[u^1].l+=minn,s+=minn,sum+=minn*e[u].c;
if(s==flow) break;
}
v[p]=0;
return s;
}
inline void solve()
{
while(spfa())
while(dfs(s,inf)&&k)
{
k--;
if(!k) return;
}
}
int main()
{
freopen("lx.in","r",stdin);
init();
if(k) solve();
cout<<-sum;
return 0;
}
原文地址:https://www.cnblogs.com/Tarjan-Zeng/p/15094253.html
- linux下操作 mysql的基本命令
- CentOs7.3 搭建 RabbitMQ 3.6 单机服务
- Redis实现信息已读未读状态提示
- HashMap源码理解
- JSP Layout详细介绍
- J2Cache——Java两级缓存框架
- SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)
- 不到百行代码实现,类似iPhone的滑块开关
- 《深入理解Java虚拟机》(一)Java虚拟机发展史
- Servlet是如何实现MVC的?
- 基础篇章:关于 React Native 的props,state,style的讲解
- 《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略
- 一个类似于进度和打卡进度的自定义view
- 《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
- Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
- Laravel框架下载,安装及路由操作图文详解
- PHP实用小技巧之调用录像的方法
- Laravel重定向,a链接跳转,控制器跳转示例
- Laravel 错误提示本地化的实现
- Laravel框架DB facade数据库操作详解
- laravel 解决强制跳转 https的问题
- 在laravel中实现将查询的对象转换为多维数组的函数
- 在Laravel 中实现是否关注的示例
- Laravel框架查询构造器常见用法总结
- laravel 解决多库下的DB::transaction()事务失效问题
- laravel 实现上传图片到本地和前台访问示例
- laravel框架模型中非静态方法也能静态调用的原理分析
- Laravel 5.2 文档 数据库 —— 起步介绍