一遍的话秩序要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. SQL Server代码如何快速格式化,sqlserver代码

    在SQL Server中我们经常需要编写各种SQL脚本,例如存储过程和函数等,由于在编写过程中,经常会进行调整,有些关键字我们用的大写,有的我们用的小写,有的后面结束用:分割有的又没有.对于有强迫症的 ...

  2. python 打印的异常回溯和代码不对应

    正在运行的程序没有停止 又重新install了导致site-packages里的代码改变 正在运行的是老代码, 当出现异常时打印的行数是老代码,但显示的行的内容时新代码

  3. Android Studio增加assets目录、raw目录

    assets与res/raw不同 assets目录是Android的一种特殊目录,用于放置APP所需的固定文件,且该文件被打包到APK中时,不会被编码到二进制文件. Android还存在一种放置在re ...

  4. 装饰者模式(Decorator、Compoment)(早餐销售装饰,动态添加职责)

    适用于以下情况: (1)需要扩展一个类的功能,或给一个类添加附加职责. (2)需要动态的给·一个对象添加功能,这些功能可以再动态的撤销. (3)需要增加由一些基本功能的排列组合而产生的非常大量的功能, ...

  5. Sql Server实现自动增长

    在学习中遇到这个问题 数据库里有编号字段 BH00001 BH00002 BH00003 BH00004 如何实现自动增长 --下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号. --得 ...

  6. LOJ 6042 跳蚤王国的宰相

    LOJ 6042 跳蚤王国的宰相 题意 跳蚤王国爆发了一场动乱,国王在镇压动乱的同时,需要在跳蚤国地方钦定一个人来做宰相. 由于当时形势的复杂性,很多跳蚤都并不想去做一个傀儡宰相,带着宰相的帽子,最后 ...

  7. html 输入框显示“小叉叉”的清空方法

    在IE10以下,我们的输入框input会出现小叉叉.怎么解决这个问题呢? 针对input框我们做一个处理 <style type="text/css"> input:: ...

  8. 使用jquery封装一个可以复用的提示框

    首先在html中 <div class="backcap"> <div class="diolag"> <div class=&q ...

  9. jeecms 强大的采集功能优化 转载 https://blog.csdn.net/jeff06143132/article/details/7099003

    ========================================================= 没办法附件上传不了,AcquisitionSvcImpl.java类: //---- ...

  10. 压缩过的jQuery

    /*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ !function(e,t){ ...