POJ 3422 Kaka's Matrix Travels | 费用流
来源:互联网 发布:python 中文注释 编辑:程序博客网 时间:2024/05/01 19:00
最初的想法是这样的,先走一条最大费用流,沿路回来把所有的点的权值更新为0,然后再跑最大费用流,嗯,好像很对。后来想想,这完全不符合网络流的思想啊Orz。
题意:
一个矩阵,每个grid都有一个权值。从左上角走到右下角,每次只能往下或者往右走。
每走一趟,就把走过的格子的权值覆盖为0, 让你求出走K 趟的所获得权值最大。
思路:
既然每个格子走一次就变为0, 则说明每个值只能取一次,妥妥的拆点。
每走一趟,流量加1。当流量达到K时,跳出算法即可。
建图:
这题有点特殊的是,每个格子可以走多次。因此所拆的点间连的边,要建两条。
第一条,费用为权值,流量为1;
第二条,费用为0, 流量INF;
源汇点自行添加即可。
AC代码:
#include <cstring>#include <cstdlib>#include <cstdio>#include <iostream>#include <queue>using namespace std;#define debug cout<<"??"<<endl;const int MAXEDGE = 1e5 + 5;const int MAXN = 5005;const int INF = 0x3f3f3f3f;int n, k;int a[55][55];struct CEdge{ int from, to, cap, flow, cost, next;}edge[MAXEDGE];struct CMCMF{ int s, t, pp, cot; int head[MAXN], a[MAXN], d[MAXN], p[MAXN]; bool inq[MAXN]; CMCMF(int ss, int tt) { s = ss, t = tt; pp = cot = 0; memset(head, -1, sizeof(head)); } void addEdge(int u, int v, int cap, int cost) { edge[pp] = (CEdge){u, v, cap, 0, cost, head[u]}; head[u] = pp++; edge[pp] = (CEdge){v, u, 0, 0, -cost, head[v]}; head[v] = pp++; } bool bellmanFord(int &flow, int &cost) { if(flow >= k) return false; memset(inq, false, sizeof(inq)); memset(d, INF, sizeof(d)); queue <int> q; q.push(s), inq[s] = true; d[s] = 0, a[s] = INF, p[s] = -1; while(!q.empty()) { int u = q.front(); q.pop(), inq[u] = false; int next = head[u]; while(next != -1) { CEdge &e = edge[next]; if(e.cap > e.flow && d[e.to] > d[u] + e.cost) { d[e.to] = d[u] + e.cost; a[e.to] = min(a[u], e.cap - e.flow); p[e.to] = next; if(!inq[e.to]) inq[e.to] = true, q.push(e.to); } next = e.next; } } if(d[t] == INF) return false; cost += d[t] * a[t]; flow += a[t]; //cout<<"cost = "<<cost<<endl; //cout<<"flow = "<<flow<<endl; int u = t; while(u != s) { edge[p[u]].flow += a[t]; edge[p[u]^1].flow -= a[t]; u = edge[p[u]].from; } return true; }};int main(){ while(scanf("%d%d",&n ,&k) != EOF) { int s = 1+n*n, t = n*n; CMCMF mcmf(s, t); for(int i = 0;i < n; i++) { for(int j = 1;j <= n; j++) { scanf("%d",&a[i][j]); mcmf.addEdge(i*n+j+n*n, i*n+j, 1, -a[i][j]); mcmf.addEdge(i*n+j+n*n, i*n+j, INF, 0); if(i != n-1) mcmf.addEdge(i*n+j, (i+1)*n+j+n*n, INF, 0); if(j != n) mcmf.addEdge(i*n+j, i*n+j+1+n*n, INF, 0); } } int flow = 0, cost = 0; while(mcmf.bellmanFord(flow, cost)); //cout<<"flow = "<<flow<<endl; cout<<-cost<<endl; } return 0;}
0 0
- poj Kaka's Matrix Travels 费用流
- poj 3422 Kaka's Matrix Travels 最小费用最大流
- Kaka's Matrix Travels POJ 3422 最大费用流
- POJ 3422 Kaka's Matrix Travels (最大费用最大流)
- POJ 3422 Kaka's Matrix Travels (最大费用最大流)
- POJ 3422 Kaka's Matrix Travels 费用流
- POJ 3422 Kaka's Matrix Travels 最小费用流
- poj-3422-Kaka's Matrix Travels-最小费用最大流
- POJ 3422 Kaka's Matrix Travels 最小费用最大流
- poj 3422 Kaka's Matrix Travels 费用流
- 【POJ】 3422 Kaka’s Matrix Travels 费用流
- POJ 3422 Kaka's Matrix Travels | 费用流
- poj 3422 Kaka's Matrix Travels (费用流)
- POJ 3422 Kaka's Matrix Travels(费用流)
- 【最大费用最大流】POJ-3422 Kaka's Matrix Travels
- POJ 3422 Kaka's Matrix Travels(费用流)
- POJ 3422 Kaka's Matrix Travels(费用流)
- poj 3422 Kaka's Matrix Travels 费用流
- 将博客搬至CSDN
- 关于 WiresShark 的一些事情
- 类名.Class文件的对象(类名.Class文件作为一个类的实例化)
- Android.mk的用法和基础
- HTML5 Canvas超炫酷烟花动画!
- POJ 3422 Kaka's Matrix Travels | 费用流
- 动态和静态树,ajax读取数据
- 关于概率dp的个人理解与总结
- HBase 之 TableDescriptors FSTableDescriptors HTableDescriptor HColumnDescriptor
- 获得MAC地址
- leetcode 刷题之路 49 Unique Binary Search Trees
- Spring bean id相同覆盖的问题解决
- 一转倾心 OPPO N1 mini降价 OPPO N1 mini值不值得购买介绍
- [LeetCode]Median of Two Sorted Arrays