POJ 3422 Kaka's Matrix Travels (最小费用最大流)
POJ 3422 Kaka's Matrix Travels
源点和左上角连边,流量为k,费用为0. 右下角与汇点连边。流量为k,费用为0.
每次在残余网络中找费用最短路进行增广就可以。
- /*
- ID: wuqi9395@126.com
- PROG:
- LANG: C++
- */
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<fstream>
- #include<cstring>
- #include<ctype.h>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define INF (1 << 20)
- #define LINF (1LL << 60)
- #define PI acos(-1.0)
- #define mem(a, b) memset(a, b, sizeof(a))
- #define rep(i, a, n) for (int i = a; i < n; i++)
- #define per(i, a, n) for (int i = n - 1; i >= a; i--)
- #define eps 1e-6
- #define debug puts("===============")
- #define pb push_back
- #define mkp make_pair
- #define all(x) (x).begin(),(x).end()
- #define fi first
- #define se second
- #define SZ(x) ((int)(x).size())
- #define POSIN(x,y) (0 <= (x) && (x) < n && 0 <= (y) && (y) < m)
- typedef long long ll;
- typedef unsigned long long ULL;
- const int maxn = 5555;
- const int maxm = 500000;
- struct node {
- int v, cap, nxt, cost;
- } e[maxm * 2];
- int g[maxn], cnt, st, ed, n, m;
- int ans, flow;
- int nt, k;
- void add(int u, int v, int cap, int cost) {
- e[++cnt].v = v;
- e[cnt].cap = cap;
- e[cnt].cost = cost;
- e[cnt].nxt = g[u];
- g[u] = cnt;
- e[++cnt].v = u;
- e[cnt].cap = 0;
- e[cnt].cost = -cost;
- e[cnt].nxt = g[v];
- g[v] = cnt;
- }
- void init() {
- cnt = 1;
- ans = flow = 0;
- memset(g, 0, sizeof(g));
- // 加边
- int w;
- int p = nt * nt;
- for (int i = 1; i <= nt; i++) {
- for (int j = 1; j <= nt; j++) {
- scanf("%d", &w);
- int id = (i - 1) * nt + j;
- add(id, id + p, 1, -w);
- add(id, id + p, k, 0);
- if (i < nt) add(id + p, id + nt, k, 0);
- if (j < nt) add(id + p, id + 1, k, 0);
- }
- }
- st = 0, ed = p * 2 + 1;
- n = ed;
- add(st, 1, k, 0);
- add(p * 2, ed, k, 0);
- }
- int dis[maxn], que[maxn], pre[maxn];
- bool vis[maxn];
- bool spfa() {
- int font = 0, rear = 1;
- for(int i = 0; i <= n; i ++) {
- dis[i] = INF;
- vis[i] = false;
- }
- dis[st] = 0;
- que[0] = st;
- vis[st] = true;
- while(rear != font) {
- int u = que[font++];
- font %= n;
- vis[u] = false;
- for(int i = g[u]; i; i = e[i].nxt) {
- int v = e[i].v;
- if(e[i].cap && dis[v] > dis[u] + e[i].cost) {
- dis[v] = dis[u] + e[i].cost;
- pre[v] = i;
- if(!vis[v]) {
- vis[v] = true;
- que[rear++] = v;
- rear %= n;
- }
- }
- }
- }
- if(dis[ed] == INF) return false;
- return true;
- }
- void augment() {
- int u, p, mi = INF;
- for(u = ed; u != st; u = e[p ^ 1].v) {
- p = pre[u];
- mi = min(mi, e[p].cap);
- }
- for(u = ed; u != st; u = e[p ^ 1].v) {
- p = pre[u];
- e[p].cap -= mi;
- e[p ^ 1].cap += mi;
- ans += mi * e[p].cost; // cost记录的为单位流量费用。必须得乘以流量。
- }
- flow += mi;
- }
- int MCMF() {
- init();
- while(spfa()) augment();
- return ans;
- }
- int main () {
- while(~scanf("%d%d", &nt, &k)) {
- printf("%d\n", -MCMF());
- }
- return 0;
- }
POJ 3422 Kaka's Matrix Travels (最小费用最大流)的更多相关文章
- POJ 3422 Kaka's Matrix Travels(费用流)
POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似 ...
- POJ训练计划3422_Kaka's Matrix Travels(网络流/费用流)
解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次仅仅能向右和向下走,走到一个格子上加上格子的数,能够走k次.问最大的和是多少. 思路: 建图:每一个格子掰成两个点,分别叫" ...
- [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
/* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...
- POJ3422 Kaka's Matrix Travels 【最大费用最大流】
Kaka's Matrix Travels Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8006 Accepted: ...
- POJ 3686:The Windy's(最小费用最大流)***
http://poj.org/problem?id=3686 题意:给出n个玩具和m个工厂,每个工厂加工每个玩具有一个时间,问要加工完这n个玩具最少需要等待的平均时间.例如加工1号玩具时间为t1,加工 ...
- poj Kaka's Matrix Travels
Kaka's Matrix Travels 题目: 给出一个矩阵.求仅仅能向下或者向右的情况下能得到的最大和.一般的是指遍历一次,而这个是能够反复走K次.每经过一次后就把该点设为0.求最大和. 算法: ...
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
随机推荐
- Flex 全屏显示方法
1,修改html-template下的index.template.html文件…增加四行 1</html> 上述文件增加了四行…见我文中有提示 2,Mxml文件: 假如一个button按 ...
- POJ 2762 Going from u to v or from v to u? (Tarjan) - from lanshui_Yang
Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has ...
- [置顶] JDK-Future 模式和实现
最近的项目用到了多线程,发现java.util.concurrent.Future蛮好用的. 像平时,写多线程一般使用Thread/Runnable,直接扔给线程池执行就好了.但是遇到了一些需要获取线 ...
- paip.最新的c++ qt5.1.1环境搭建跟hello world
paip.最新的c++ qt5.1.1环境搭建跟hello world 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://bl ...
- 悬浮二维码 QQ ToTop
//回顶部 <div id="lqdbe" style="position: absolute; visibility: visible; z-index: 1; ...
- git 无法添加文件夹下文件
最近做项目时,发现无法提交某个子文件夹下的文件. google后发现可能是该子文件夹下有.git文件夹导致无法上传. 删除子文件夹下.git后,依然无法提交子文件夹下的文件. 继续google, 尝试 ...
- jquery日历签到控件的实现
calendar.js var calUtil = { //当前日历显示的年份 showYear:2015, //当前日历显示的月份 showMonth:1, //当前日历显示的天数 showDays ...
- 门面(Facade)模式--医院,保安系统实例
门面(Facade)模式 http://www.cnblogs.com/zhenyulu/articles/55992.html
- 2015-12-27 socket的用法
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) sk.bind(address) s.bind(address) 将套接字绑定到地址.a ...
- JS 移动动画
function moveElement(elementId, final_x, final_y,interval) { if (!document.getElementById ...