一遍的话秩序要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. 【一坨理论AC的题】Orz sxy大佬

    1.UVA10891 Game of Sum 2.LA4254 Processor . 3.UVA10905 Children's Game 4.UVA11389 The Bus Driver Pro ...

  2. VS2012与windos版本不兼容问题

    昨天晚上加完班,想着把windows更新下.今天上午就发现再运行VS报错了,提示VS2012与windows版本不兼容,打开.sln文件后,VS自动关闭.错误如下: 查看后网上提示安装VS2012的一 ...

  3. 在scrapy中利用Selector来提取数据

    1.创建对象 Selector类的实现位于scrapy.selector模块,创建Selector对象的时候,可以将页面的Html文档字符串传递给Selector构造器方法 2.选中数据 调用Sele ...

  4. Leetcode151. Reverse Words in a String翻转字符串里的单词

    给定一个字符串,逐个翻转字符串中的每个单词. 示例: 输入: "the sky is blue", 输出: "blue is sky the". 说明: 无空格 ...

  5. mysql导出数据库某些表的数据

    # 导出数据,一般从从库导出,减少主库的压力.mysqldump -hhostname -P3306 --single-transaction --master-data= database_name ...

  6. 图像通道、Scalar、分离、合成通道

    http://lib.csdn.net/article/opencv/33264 http://blog.csdn.net/laohu_tiger/article/details/17359777 h ...

  7. Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字

    search_fields = ('name','qq',) 登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html search_fields = ( ...

  8. H5C3--边框阴影box-shadow

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. VSCode 配置阿里云CentOS 7.6 远程开发

    配置步骤 一.windows 10 开发机配置 windows 10 1809后支持ssh命令 1.生成ssh密钥.使用以下命令,先生成本地公钥和私钥ssh-keygen -t rsa -b 4096 ...

  10. java并发系列(四)-----源码角度彻底理解ReentrantLock(重入锁)

    1.前言 ReentrantLock可以有公平锁和非公平锁的不同实现,只要在构造它的时候传入不同的布尔值,继续跟进下源码我们就能发现,关键在于实例化内部变量sync的方式不同,如下所示: /** * ...