poj 3422(最小费用最大流)
题目链接:http://poj.org/problem?id=3422
思路:求从起点到终点走k次获得的最大值,最小费用最大流的应用:将点权转化为边权,需要拆点,边容量为1,费用为该点的点权,表示该点的权值只能获取一次,另外,应该连一条容量为inf,费用为0的边,因为每条边都可以走多次。另外就是增加源点和汇点了,源点与起点连容量为k,费用为0的边,表示可以走k次,同理终点与汇点也如此。然后就是求最大费用了,这与求最小费用类似,只需将spfa函数稍作修改即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 8888
#define MAXM 4444444
#define inf 1<<30 struct Edge {
int v,cap,cost,next;
} edge[MAXM]; int n,m,vs,vt,NE;
int head[MAXN]; void Insert(int u,int v,int cap,int cost)
{
edge[NE].v=v;
edge[NE].cap=cap;
edge[NE].cost=cost;
edge[NE].next=head[u];
head[u]=NE++; edge[NE].v=u;
edge[NE].cap=;
edge[NE].cost=-cost;
edge[NE].next=head[v];
head[v]=NE++;
} int cur[MAXN],pre[MAXN];
bool mark[MAXN];
int dist[MAXN]; bool spfa(int vs,int vt)
{
memset(mark,false,sizeof(mark));
fill(dist,dist+vt+,-inf);
dist[vs]=;
queue<int>que;
que.push(vs);
while(!que.empty()) {
int u=que.front();
que.pop();
mark[u]=false;
for(int i=head[u]; i!=-; i=edge[i].next) {
int v=edge[i].v,cost=edge[i].cost;
if(edge[i].cap>&&dist[u]+cost>dist[v]) {
dist[v]=dist[u]+cost;
pre[v]=u;
cur[v]=i;
if(!mark[v]) {
mark[v]=true;
que.push(v);
}
}
}
}
return dist[vt]!=-inf;
} int MinCostFlow(int vs,int vt)
{
int flow=,cost=;
while(spfa(vs,vt)) {
int aug=inf;
for(int u=vt; u!=vs; u=pre[u]) {
aug=min(aug,edge[cur[u]].cap);
}
flow+=aug;
cost+=dist[vt]*aug;
for(int u=vt; u!=vs; u=pre[u]) {
edge[cur[u]].cap-=aug;
edge[cur[u]^].cap+=aug;
}
}
return cost;
} int map[][];
int dir[][]= {{,},{,}}; int main()
{
// freopen("1.txt","r",stdin);
while(~scanf("%d%d",&n,&m)) {
NE=;
vs=,vt=*n*n+;
memset(head,-,sizeof(head));
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
scanf("%d",&map[i][j]);
for(int i=; i<=n; i++) {
for(int j=; j<=n; j++) {
Insert((i-)*n+j,(i-)*n+j+n*n,,map[i][j]);
Insert((i-)*n+j,(i-)*n+j+n*n,inf,);
for(int k=; k<; k++) {
int x=i+dir[k][],y=j+dir[k][];
if(x<=n&&y<=n)
Insert((i-)*n+j+n*n,(x-)*n+y,inf,);
}
}
}
Insert(vs,,m,);
Insert(*n*n,vt,m,);
printf("%d\n",MinCostFlow(vs,vt));
}
return ;
}
poj 3422(最小费用最大流)的更多相关文章
- POJ 2516 最小费用最大流
每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...
- POJ - 2195 最小费用最大流
题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...
- poj 2195 最小费用最大流模板
/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...
- POJ 2135 最小费用最大流 入门题
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19207 Accepted: 7441 Descri ...
- poj 2135最小费用最大流
最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ...
- poj 3680(最小费用最大流)
题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...
- POJ 2315 最小费用最大流
从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模. 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E ...
- POJ 2135 最小费用最大流
题目链接 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18961 Accepted: 7326 D ...
- POJ 3422 Kaka's Matrix Travels (最小费用最大流)
POJ 3422 Kaka's Matrix Travels 链接:http://poj.org/problem? id=3422 题意:有一个N*N的方格,每一个方格里面有一个数字.如今卡卡要从左上 ...
随机推荐
- OpenERP ODOO 千分位设置
转自 :http://www.chinamaker.net/ OpenERP (ODOO)千分位设置在: 设置 > 翻译>语言 1)不同语言可以设置不同的千分位 2)格式选择: Separ ...
- [LeetCode] Add Two Numbers(stored in List)
首先,演示一个错误的reverList class Solution { public: ListNode* reverse(ListNode* root) { if(NULL == root) re ...
- Spring Boot(一)启动方式
1.系统自动生成 SpringApplication.run(XX.class, args); 2.创建SpringApplication对象 SpringApplication app = new ...
- hibernate 关系映射之 双向外键关联一对一
在上一篇博客内容的基础上做了以下修改,即可实现. 注解方式: package com.bjsxt.hibernate; import javax.persistence.Entity; imp ...
- 最实用、最常用的jQuery代码片段
// chinacoder.cn JavaScript Document $(document).ready(function() { //.filter(":not(:has(.selec ...
- 在 SELECT 查询中使用集运算符
在 SELECT 查询中使用集运算符,可以将来自两个或多个查询的结果合并到单个结果集中. 在进行集运算之前,请确保: (1)所有输入集合中,列数和列的顺序必须相同. (2)对应的列中,数据类型必须兼容 ...
- 【转载】XGBoost调参
General Parameters: Guide the overall functioning Booster Parameters: Guide the individual booster ( ...
- sklearn 中模型保存的两种方法
一. sklearn中提供了高效的模型持久化模块joblib,将模型保存至硬盘. from sklearn.externals import joblib #lr是一个LogisticRegressi ...
- Sql添加测试数据
--建测试表 CREATE TABLE T_UserInfo ( Userid varchar(20), UserName varchar(20), RegTime datetime, Tel va ...
- js 时间戳
https://www.cnblogs.com/crf-Aaron/archive/2017/11/16/7844462.html var time = '2018-03-22 00:00:00'.r ...