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 ...
随机推荐
- day3- python 注册
# .先把文件内容的账号密码放到list/字典 f = open('users') result = f.read() f.close() user_list = result.split() # u ...
- leetcode-11-dfs
DFS算法: explore(G, v) visited(v) = trueprevisit(v) for each edge(v, u) in E: if not visited(u): explo ...
- python——全局变量&局部变量
>>> count = 5 >>> def function(): count = 10 print(10) >>> function() 10 ...
- LightOj:1265-Island of Survival
Island of Survival Time Limit: 2 second(s) Memory Limit: 32 MB Program Description You are in a real ...
- 大家好,我是一个JAVA初学者,想在这里记下自己学习过程中的点点滴滴,请多多关照
大家好,我是一个JAVA初学者,想在这里记下自己学习JAVA的点点滴滴,请多多关照. 以前一直在QQ空间里记录的,但感觉有些麻烦,而且有些东西自己理解的并不完善甚至都不正确,现在开始在这里重新记录,从 ...
- UVa 465 Overflow——WA
上次那个大数开方的高精度的题,UVa113 Power of Cryptography,直接两个double变量,然后pow(x, 1 / n)就A过去了. 怎么感觉UVa上高精度的题测试数据不给力啊 ...
- session属性的清除和非法登录
有的项目会将登录用户的资料存于session的一个属性中,这样方便获取一些数据使用,但是用户退出时需要将session的这个属性清除,一面造成一些不必要的麻烦,但是有些时候,在后台清除了这个属性,在拦 ...
- TOJ4277: Sequence 组合数学
4277: Sequence Time Limit(Common/Java):2000MS/6000MS Memory Limit:65536KByte Total Submit: 39 ...
- Navicat数据库备份还原
Navicat数据库备份包括数据和架构 还原数据库:把备份文件复制到备份文件夹所在位置,还原即可
- Java容器jdk1.6 Array
参考:https://www.cnblogs.com/tstd/p/5042087.html 1.定义 顶层接口collection public interface Collection<E& ...