HOJ - 2715最小费用流
国庆八天乐,刷题也快乐。
HOJ崩了,但是VJ可以把题目挂出来。
题目链接:https://vjudge.net/contest/188441#problem/A
涉及到矩阵里面的网络流,化为图来做。
某个点有流量限制,一定要想到拆点。
求最大值的话,要把w变成负数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 6e3;
const int INF = 1e9;
int vis[maxn],dist[maxn];
int tot,head[maxn];
int pv[maxn],pe[maxn];
struct edge
{
int to,pre,cap,cost;
}e[];
void init()
{
tot = ;
memset(head,-,sizeof(head));
}
void add(int from,int to,int cap,int cost)
{
e[tot].pre = head[from];
e[tot].to = to;
e[tot].cap = cap;
e[tot].cost = cost;
head[from] = tot++;
}
void addedge(int from,int to,int cap,int cost)
{
add(from,to,cap,cost);
add(to,from,,-cost);
}
int n,k;
int min_cost_flow(int s,int t,int f,int& max_flow)
{
int ret = ;
while(f>&&(k--))
{
memset(vis,,sizeof(vis));
for(int i=;i<maxn;i++) dist[i] = INF;
dist[s] = ;
queue<int> q;
q.push(s);
while(!q.empty())
{
int v = q.front(); q.pop();
vis[v] = ;
for(int i=head[v];i>=;i=e[i].pre)
{
int to = e[i].to,cap = e[i].cap,cost = e[i].cost;
if(cap>&&dist[to]>dist[v]+cost)
{
pv[to] = v,pe[to] = i;
dist[to] = dist[v] + cost;
if(!vis[to]) q.push(to);
vis[to] = ;
}
}
// printf("%d\n",v);
}
//printf("%d\n",dist[t]);
if(dist[t]==INF) return ret;///同一目的地,每次增广路都是最小费用
///当所有边的流量都流净后,即没有残余网络,返回。
int d = f;
for(int v=t;v!=s;v=pv[v])
{
d = min(d,e[pe[v]].cap);
}
f -= d;
max_flow += d;
ret += d*dist[t]; ///走一单位就消耗dist[t]
for(int v=t;v!=s;v=pv[v])
{
e[pe[v]].cap -= d;
e[pe[v]^].cap += d;
}
}
return ret;
}
int height[][];
int value[][];
int judge(int x,int y)
{
if(x<=||x>=(n-)||y<=||y>=(n-)) return ;
else return ;
}
int judge1(int x,int y)
{
if(x>=&&x<=(n-)&&y>=&&y<=(n-)) return ;
else return ;
}
int to[][] = {,,-,,,,,-};
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&k);
init(); ///千万别忘记写
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
scanf("%d",&value[i][j]);
}
}
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
scanf("%d",&height[i][j]);
}
}
int s = *n*n+;
int t = *n*n+;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
addedge(s,i*n+j,INF,);
addedge(i*n+j,i*n+j+n*n,,-value[i][j]);
addedge(i*n+j,i*n+j+n*n,INF,); ///addedge(i',i'',inf,0)的边,可以再次走,只不过没有宝藏了
if(judge(i,j))
{
addedge(i*n+j+n*n,t,INF,);
}
}
}
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
for(int k=;k<;k++)
{
int nextx = i+to[k][];
int nexty = j+to[k][];
if(judge1(nextx,nexty)&&height[i][j]>height[nextx][nexty])
{
addedge(i*n+j+n*n,nextx*n+nexty,INF,);
}
}
}
}
int max_flow = ;
int ans = min_cost_flow(s,t,INF,max_flow);
if(ans==)
{
printf("%d\n",ans);
}
else
{
printf("%d\n",-ans);
}
}
return ;
}
/*
4 5
1 2 1
2 3 1
3 4 1
1 3 2
2 4 1
*/
HOJ - 2715最小费用流的更多相关文章
- hoj 2715 (费用流 拆点)
http://acm.hit.edu.cn/hoj/problem/view?id=2715 将每个格子 i 拆成两个点 i’, i’’并加边(i’, i’’, 1, -Vi), (i’, i’’, ...
- HOJ - 2543最小费用流
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2543 这个题目挺有意思. 自己扣了一会儿,发现图挺好建,就把(u,v,f,w) 拆成(u,v,f,0) ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- HIT 2715 - Matrix3 - [最小费用最大流][数组模拟邻接表MCMF模板]
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2715 Time limit : 5 sec Memory limit : 64 M Zhouguyue ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- HOJ 1797 Red and Black
传送门 http://acm.hit.edu.cn/hoj/problem/view?id=1797 总体的思路是遍历可以到达的' . ',将其对应的vis数组化为1,然后统计所有为1的vis项; ...
- POJ2195 最小费用流
题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...
- HDU 4067 hdoj 4067 Random Maze 最小费用流
给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费:否则,移除这条边需要花费b. 题目要求用最小费用构造一个有向图满足以下条件: 1.只有一个入口和出口 2.所有路都 ...
- HOJ 1001: A+B; 1002: A+B+C
两道水题,用来熟悉 HOJ 的提交系统. 1001:输入两个整数 A, B (0 <= A,B <= 10),输出 A+B. #include <iostream> using ...
随机推荐
- Java-JFrame可视化开发
Java-JFrame可视化开发的一般步骤 JFrame可以做出类似于QQ登录功能的窗体,通过JFrame可以利用Java代码实现窗体功能,一般用于CS项目的C(客户端)的开发: 利用JFrame可以 ...
- 【android】【android studio】修改emulator的本地化环境
Changing the emulator locale from the adb shell To change the locale in the emulator by using the ad ...
- 02 Django模型
ORM 的作用 ORM 作用示意图 ORM 框架的功能 建立模型类和表之间的对应关系,允许通过面向对象的方式来操作数据库 根据设计的模型类生成数据库中的表格. 通过方便的配置就可以进行数据库的切换 数 ...
- 安装好的IIS,发布成功后打开网站出现错误
开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示“处理程序“PageHandlerFactory ...
- HBase0.94.2-cdh4.2.0需求评估测试报告1.0之二
Hbase 配置文件: hbase-site.xml <configuration> <property> <name>hbase.cluster.distribu ...
- BZOJ 2465: [中山市选2009]小球
难度在于读题 #include<cstdio> #include<algorithm> using namespace std; int a[1000005]; struct ...
- Python ORM
本章内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句.如果 ...
- luogu1441 砝码称重
搜索+背包就是了 #include <iostream> #include <cstring> #include <cstdio> using namespace ...
- TOJ2680: 最大矩阵连乘次数
2680: 最大矩阵连乘次数 Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal Submit: 144 ...
- C++之Effective STL学习笔记Item7
假设我们现在有以下代码: void doSomething() { vector<Widget*> vwp; ; i < SOME_MAGIC_NUMBER; ++i) vwp.pu ...