HDU 3376 费用流 Matrix Again
题意:
给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大。
分析:
如果n比较小的话是可以DP的,但是现在n非常大,DP会超时的。
这个用费用流来求解:
因为每个点只能走一次,所以先拆点,两点之间连一条容量为1费用为对应格子权值的边,如果是起点或终点,因为要走两次,所以要连容量为2的边。
对于不同格子之间,如果能到达,连一条容量为INF,费用为0的边。
因为算法求的是最小费用,所以我们把每个格子的相反数当做费用去连边,最后再取相反数。
因为起点和终点容量为2,计算出来的最大权值重复计算了左上角和右下角的权值,所以答案应该再减去这两个数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std; const int maxn = ;
const int maxnode = maxn * maxn * ;
const int maxm = + ;
const int INF = 0x3f3f3f3f; struct Edge
{
int from, to, cap, flow, cost;
int nxt;
Edge() {}
Edge(int u, int v, int cap, int f, int cost, int nxt):from(u), to(v), cap(cap), flow(f), cost(cost), nxt(nxt) {}
}; int ecnt;
Edge edges[maxm << ];
int head[maxnode]; void AddEdge(int u, int v, int cap, int cost)
{
edges[ecnt] = Edge(u, v, cap, , cost, head[u]);
head[u] = ecnt++;
edges[ecnt] = Edge(v, u, , , -cost, head[v]);
head[v] = ecnt++;
} int row;
int A[maxn][maxn]; int n;
int d[maxnode + ], p[maxnode + ], a[maxnode + ];
bool inq[maxnode + ]; bool SPFA(int s, int t)
{
memset(inq, false, sizeof(inq));
memset(p, -, sizeof(p));
memset(d, 0x3f, sizeof(d));
inq[s] = true;
d[s] = ;
a[s] = INF; queue<int> Q;
Q.push(s);
while(!Q.empty())
{
int u = Q.front(); Q.pop(); inq[u] = false;
for(int i = head[u]; ~i; i = edges[i].nxt)
{
Edge& e = edges[i];
int v = e.to;
if(e.flow < e.cap && d[u] + e.cost < d[v])
{
d[v] = d[u] + e.cost;
p[v] = i;
a[v] = min(a[u], e.cap - e.flow);
if(!inq[v]) { inq[v] = true; Q.push(v); }
}
}
} return d[t] != INF;
} int Mincost(int s, int t)
{
int flow = ;
int cost = ;
while(SPFA(s, t))
{
flow += a[t];
cost += d[t] * a[t];
int u = t;
while(u != s)
{
edges[p[u]].flow += a[t];
edges[p[u]^].flow -= a[t];
u = edges[p[u]].from;
}
}
return cost;
} int main()
{
while(scanf("%d", &row) == )
{
for(int i = ; i < row; i++)
for(int j = ; j < row; j++) scanf("%d", &A[i][j]); n = row * row;
int s = , t = n * - ;
ecnt = ;
memset(head, -, sizeof(head)); //build graph
for(int i = ; i < row; i++)
for(int j = ; j < row; j++)
{
int u = i * row + j;
int v = u + n;
int cap = ;
if(u == || u == n - ) cap++;
AddEdge(u, v, cap, -A[i][j]); int w;
if(i < row - )
{
w = u + row;
AddEdge(v, w, INF, );
}
if(j < row - )
{
w = u + ;
AddEdge(v, w, INF, );
}
} n <<= ;
printf("%d\n", -Mincost(s, t) - A[][] - A[row-][row-]);
} return ;
}
代码君
HDU 3376 费用流 Matrix Again的更多相关文章
- Going Home HDU - 1533 费用流
http://acm.hdu.edu.cn/showproblem.php?pid=1533 给一个网格图,每两个点之间的匹配花费为其曼哈顿距离,问给每个的"$m$"匹配到一个&q ...
- hdu 5045 费用流
滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...
- hdu 2686 费用流 / 双线程DP
题意:给一个方阵,求从左上角出到右下角(并返回到起点),经过每个点一次不重复,求最大获益(走到某处获得改点数值),下来时每次只能向右或向下,反之向上或向左. 俩种解法: 1 费用流法:思路转化:从左 ...
- hdu 4406 费用流
这题问题就是当前时刻究竟选择哪门课程,易知选择是和分数有关的,而且是一个变化的权值,所以能够用拆点的方式,把从基础分到100分都拆成点.但若这样拆点的话,跑费用流时就必须保证顺序.这样就麻烦了..观察 ...
- hdu 1853 (费用流 拆点)
// 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...
- HDU 3667 费用流 拆边 Transportation
题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...
- HDU 3667 费用流(拆边)
题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...
- HDU 5644 (费用流)
Problem King's Pilots (HDU 5644) 题目大意 举办一次持续n天的飞行表演,第i天需要Pi个飞行员.共有m种休假计划,每个飞行员表演1次后,需要休假Si天,并提供Ti报酬来 ...
- HDU - 4780费用流
题意:M台机器要生产n个糖果,糖果i的生产区间在(si, ti),花费是k(pi-si),pi是实际开始生产的时间机器,j从初始化到生产糖果i所需的时间Cij,花费是Dij,任意机器从生产糖果i到生产 ...
随机推荐
- spring cloud 测试的时候报 BeanCreationNotAllowedException: Error creating bean with name 'eurekaAutoServiceRegistration' 但能正确跑完测试方法
因为都能正确的跑测试方法,所以我也不太注意它,但是有时候闲得蛋疼就会找一下原因. 具体原因我也说不清,直接丢个连接 https://github.com/spring-cloud/spring-clo ...
- IntelJ IDEA创建简单Java工程
1. 打开IDEA J 2017开发工具,如下图: 2.点击“Create New Project”,将打开以下图: 3.选择 “Java”,选择“Next”,打开下图: 4.“Create pro ...
- git从无到有建立一个仓库并上传文件
第一步,创建仓库 登录自己的码云 第二步,本地操作 1.到你所要上传的文件夹中右键 选择git bash here 2.初始化项目 git init 3.连接远程仓库 刚才我们建立的时候的远程地址就 ...
- Vue的computed和methods区别
1,computed里面定义的方法是以属性的方式(当然也可以以函数调用的方式)出现在html里面,而methods里面定义的方法是以函数的方式: 2,computed依赖于data里面的数据,只有相关 ...
- CSS font-family 字体名称一览表
windows常见内置中文字体 字体中文名 字体英文名 宋体 SimSun(浏览器默认) 黑体 SimHei 微软雅 ...
- SharePoint 2010 缺少站点保存为模板选项
如果您尝试在SharePoint Server 2010中保存网站,并且没有看到"将网站另存为模板"选项,则可能是因为该网站已启用发布功能.如果使用站点发布功能,则有几个选项可将网 ...
- SqlServer 填充因子的说明
CREATE NONCLUSTERED INDEX IX_d_name ON department(d_name) with fillfactor=30 使用 fill factor 选项可以指定 M ...
- Android系统Binder机制学习总结
一.Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket.pipe等,Android中进程间通信的方式主要有三 ...
- 《学习CSS布局》学习笔记
近几天做了一个小的企业展示网站.虽然页面是在模板的基础上改的,但改的多了不熟悉CSS也很麻烦.正好我看到了学习CSS布局这个网站,于是补习了一下CSS知识. CSS的显示 CSS的元素分为两类:块级元 ...
- Spring归纳
Spring总结 bean标签的scope属性 scope="singleton",单例模式,默认值 scope="prototype",多例模式 注解元素 @ ...