一遍的话秩序要dp就好,但是这里要删去点。此题可以转化为最小费用流。开始我想了半天纠结怎么处理到过一次后值变0,看了书之后发现拆点解决了这个问题。

对于点t,拆为t-->t',容量为1,费用为负的矩阵的值,那就解决了只能一次。如果2个点连通,s-->t,就相连,s-->t,s-->t',t'->s',t'->s,容量为无穷,费用0。

然后费用流,得到的值取负即可。

#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 99999999
using namespace std;
const int maxn = ;
struct mp
{
int v;
int cnt;
} map[][];
struct node
{
int to;
int v;
int cost;
int flag;
int next;
} edge[maxn*maxn/];
int pre[maxn],fpre[maxn],index,head[maxn],dis[maxn],n,k,N;
int ok(int x1,int y1,int x2,int y2)
{
if(x1>=n||y1>=n||x2>=n||y2>=n)
return ;
return ;
}
void add(int x,int y,int v,int cost)
{
edge[index].to=y;
edge[index].v=v;
edge[index].cost=cost;
edge[index].flag=index+;
edge[index].next=head[x];
head[x]=index++;
edge[index].to=x;
edge[index].v=;
edge[index].cost=-cost;
edge[index].flag=index-;
edge[index].next=head[y];
head[y]=index++; }
int spfa(int S,int T)
{
int vis[maxn],i;
queue<int>q;
memset(vis,,sizeof(vis));
memset(pre,-,sizeof(pre));
for(i=; i<=T; i++)
dis[i]=INF;
dis[S]=;
vis[S]=;
pre[S]=;
q.push(S);
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=;
for(i=head[t]; i!=-; i=edge[i].next)
{
if(edge[i].v&&dis[edge[i].to]>dis[t]+edge[i].cost)
{
dis[edge[i].to]=dis[t]+edge[i].cost;
if(!vis[edge[i].to])
{
vis[edge[i].to]=;
q.push(edge[i].to);
}
pre[edge[i].to]=t;
fpre[edge[i].to]=i;
}
}
}
//printf("1\n");
if(dis[T]>=INF)return ;
return ;
}
void MCMF(int S,int T)
{
int i;
int ans=;
while(spfa(S,T))
{
int minflow=INF;
for(i=T; i!=; i=pre[i])
{
if(minflow>edge[fpre[i]].v)
minflow=edge[fpre[i]].v;
}
ans+=dis[T]*minflow;
for(i=T; i!=; i=pre[i])
{
edge[fpre[i]].v-=minflow;
edge[edge[fpre[i]].flag].v+=minflow;
}
}
printf("%d\n",-ans);
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&k))
{
N=n*n;
index=;
memset(head,-,sizeof(head));
int cnt=;
for(i=; i<n; i++)
for(j=; j<n; j++)
{
map[i][j].cnt=++cnt;
scanf("%d",&map[i][j].v);
}
for(i=; i<n; i++)
{
for(j=; j<n; j++)
{
add(map[i][j].cnt,map[i][j].cnt+N,,-map[i][j].v);
if(ok(i,j,i,j+))
{
add(map[i][j].cnt,map[i][j+].cnt,INF,);
add(map[i][j].cnt,map[i][j+].cnt+N,INF,);
add(map[i][j].cnt+N,map[i][j+].cnt,INF,);
add(map[i][j].cnt+N,map[i][j+].cnt+N,INF,);
}
if(ok(i,j,i+,j))
{
add(map[i][j].cnt,map[i+][j].cnt,INF,);
add(map[i][j].cnt,map[i+][j].cnt+N,INF,);
add(map[i][j].cnt+N,map[i+][j].cnt,INF,);
add(map[i][j].cnt+N,map[i+][j].cnt+N,INF,);
}
}
}
add(,,k,);
add(map[n-][n-].cnt,*N,k,);
int S=,T=n*n*;
MCMF(S,T);
}
}

poj3422 最小费用流的更多相关文章

  1. POJ2195 最小费用流

    题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...

  2. HDU 4067 hdoj 4067 Random Maze 最小费用流

    给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费:否则,移除这条边需要花费b. 题目要求用最小费用构造一个有向图满足以下条件: 1.只有一个入口和出口 2.所有路都 ...

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

    /* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...

  4. 【poj3422】 Kaka's Matrix Travels

    http://poj.org/problem?id=3422 (题目链接) 题意 N*N的方格,每个格子中有一个数,寻找从(1,1)走到(N,N)的K条路径,使得取到的数的和最大. Solution ...

  5. POJ 2516:Minimum Cost(最小费用流)

    https://vjudge.net/problem/11079/origin 题意:有N个商店和M个供应商和K种物品,每个商店每种物品有一个需求数,每个供应商每种物品有一个供应量,供应商到商店之间的 ...

  6. POJ-2175 Evacuation Plan 最小费用流、负环判定

    题意:给定一个最小费用流的模型,根据给定的数据判定是否为最优解,如果不为最优解则给出一个比给定更优的解即可.不需要得出最优解. 解法:由给定的数据能够得出一个残图,且这个图满足了最大流的性质,判定一个 ...

  7. Going Home (hdu 1533 最小费用流)

    集训的图论都快结束了,我才看懂了最小费用流,惭愧啊. = = 但是今天机械键盘到了,有弄好了自行车,好高兴\(^o^)/~ 其实也不是看懂,就会套个模板而已.... 这题最重要的就是一个: 多组输入一 ...

  8. POJ 2195 Going Home 最小费用流 裸题

    给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有 ...

  9. [haoi2010]订货 最小费用流

    这道题oj上的标签是动态规划,但我想不出来动态规划怎么搞,空间不爆,时间也要爆的: 好的,不扯淡,此题正常做法是最小费用流: 这道题我写了两遍,为什么呢?原因是第一次写的时候,不会写费用流,又恰好没带 ...

随机推荐

  1. js获取url链接中的域名部分

    用js提取出url中的域名(domain)部分,用split()函数就可以了. 因为一个正确的url必定是由http://或者是https://.domain.路径/参数组成,所以可以用split以/ ...

  2. mysql高级教程(一)-----逻辑架构、查询流程、索引

    mysql逻辑架构 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提 ...

  3. volatile和指令重排序

    volatile 的作用 1 精致指令重排序 2 多线程访问同一个变量的时候,每次都是取最新的,而不会使用当前cpu缓存的那一份.

  4. PAT甲级——A1046 Shortest Distance

    The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...

  5. mysql基本笔记之一

    1.创建数据库 CREATE DATABASE admin 2.查看数据库 SHOW DATABASES 3.使用数据库 USE admin 4.创建user表 CREATE TABLE user V ...

  6. vim编辑shell

      vi编辑 u撤销 i输入 dd删除游标所在的那一整行(常用) yy复制游标所在的那一行(常用) p 为将已复制的数据在光标下一行贴上 nyy n 为数字.复制光标所在的向下 n 行,例如 20yy ...

  7. Go之路一

    一.声明变量 var a int var b string var c []float32 var d func() bool var e struct{ x int } 第1行,声明一个整型类型的变 ...

  8. [原创]iFPGA-Cable FT2232H Xilinx / Altera / Lattice 三合一JTAG & UART调试器-详细使用说明

    iFPGA-Cable调试器使用说明 全文分为6部分: 第0部分:实物.连线及其驱动安装说明 第1部分:Xilinx JTAG 第2部分:UART 第3部分:Altera JTAG 第4部分:Latt ...

  9. Vim 日常操作

    显示 # 显示行号 :set nu # 插入:i # 保存并退出:wq   查找 # 最普通的查找:/search # 查找非分号开头的行.[正则表达式](php.ini 很多以分号开头的行,懒得看) ...

  10. webstorm 2017.3.5之后 激活

    选择"license server" 输入:http://idea.codebeta.cn