[Problem Description]

皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路。
火箭队一共同拥有N个据点,据点之间存在M条双向道路。据点分别从1到N标号。小智一行K人从真新镇出发,营救被困在N号据点的皮卡丘。为了方便起见,我们将真新镇视为0号据点,一開始K个人都在0号点。
因为火箭队的重重布防,要想摧毁K号据点,必须依照顺序先摧毁1到K-1号据点,而且,假设K-1号据点没有被摧毁,因为防御的连锁性,小智一行不论什么一个人进入据点K,都会被发现,并产生严重后果。因此,在K-1号据点被摧毁之前,不论什么人是不可以经过K号据点的。
为了简化问题,我们忽略战斗环节,小智一行不论什么一个人经过K号据点即觉得K号据点被摧毁。被摧毁的据点依旧是能够被经过的。
K个人是能够分头行动的,仅仅要有不论什么一个人在K-1号据点被摧毁之后,经过K号据点,K号据点就被摧毁了。显然的,仅仅要N号据点被摧毁,皮卡丘就得救了。
野外的道路是不安全的,因此小智一行希望在摧毁N号据点救出皮卡丘的同一时候,使得K个人所经过的道路的长度总和最少。
请你帮助小智设计一个最佳的营救方案吧!
[Algorithm]
最小费用最大流
[Analysis]
题目有几个关键点:
1.每个点都必须有人经过
2.经过j点时,0~j-1必须都经过了才干够
由此能够构造出一个网络流的模型。
因为每一个节点的第一次訪问,必然是由小于它的节点完毕的,所以先用floyd预处理dis[k][i][j]表示i到j仅仅经过小于等于k的点的最短路。建图例如以下
1.S->0 cap=k cost=0
2.i->T cap=1 cost=0
3.S->i+n cap=1 cost=0
4.i+n->j cap=INF cost=dis[j][i][j]
1是用来限制人数的,2则保证每一个点经过一次,因为第一次经过该点时流向了T消耗了流量,所以每一个点给予补充流量,即建图3。4则是从一个刚刚第一次经过的点继续訪问其他点。这样建图能够发现,每一个点的第一次訪问都被转化成了一条从S出发的流且没有交叉,这样能够随意调整訪问顺序,保证了j訪问之前0~j-1都已经訪问过
[Pay Attention]
因为floyd要用邻接矩阵,注意推断重边的情况取最小。
还有要从这样的点至少经过一次的建模中吸取经验
[Code]

/**************************************************************Problem: 2324User: gaotianyu1350Language: C++Result: AcceptedTime:392 msMemory:7620 kb
****************************************************************/#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <iostream>
using namespace std;#define MAXN 350
#define MAXM 300000
#define INF  0x3f3f3f3fint point[MAXN], next[MAXM], v[MAXM], flow[MAXM], cap[MAXM], w[MAXM];
int lastedge[MAXN], dis[MAXN];
bool check[MAXN];
int tot = -1;int n, m, people;
int map[MAXN][MAXN];inline void init()
{memset(map, 0x7f, sizeof(map));memset(point, -1, sizeof(point));memset(next, -1, sizeof(next));tot = -1;
}inline void addedge(int x, int y, int theCap, int theDis)
{tot++;next[tot] = point[x]; point[x] = tot; v[tot] = y; flow[tot] = 0; cap[tot] = theCap; w[tot] = theDis;tot++;next[tot] = point[y]; point[y] = tot;v[tot] = x; flow[tot] = 0; cap[tot] = 0; w[tot] = - theDis;
}inline int addflow(int s, int t)
{int now = t;int ans = INF;while (now != s){int temp = lastedge[now];ans = min(ans, cap[temp] - flow[temp]);now = v[lastedge[now] ^ 1];}now = t;while (now != s){flow[lastedge[now]] += ans;flow[lastedge[now] ^ 1] -= ans;now = v[lastedge[now] ^ 1];}return ans;
}bool spfa(int s, int t, int &maxflow, int &mincost)
{queue<int> q;while (!q.empty()) q.pop();memset(dis, 0x7f, sizeof(dis));memset(check, 0, sizeof(check));dis[s] = 0; check[s] = true; q.push(s);while (!q.empty()){int now = q.front(); q.pop();check[now] = false;for (int temp = point[now]; temp != -1; temp = next[temp])if (flow[temp] < cap[temp] && dis[now] + w[temp] < dis[v[temp]]){dis[v[temp]] = dis[now] + w[temp];lastedge[v[temp]] = temp;if (!check[v[temp]])check[v[temp]] = true, q.push(v[temp]);}}if (dis[t] > INF) return false;int add = addflow(s, t);maxflow += add;mincost += add * dis[t];return true;
}inline int solve(int s, int t)
{int maxflow = 0, mincost = 0;while (spfa(s, t, maxflow, mincost));/*{int tiaoshi = 1;tiaoshi++;}*///printf("mflow :%d\n", maxflow);return mincost;
}inline void build(int start, int end)
{addedge(start, 0, people, 0);for (int i = 1; i <= n; i++){addedge(i, end, 1, 0);addedge(start, i + n, 1, 0);//addedge(i, i + n, INF, 0);}for (int k = 0; k <= n; k++)for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++)if (i != j){if (map[i][k] < INF && map[k][j] < INF)map[i][j] = min(map[i][j], map[i][k] + map[k][j]);if (k == j && i < j && map[i][j] < INF)addedge(i == 0 ? 0 : i + n, j, INF, map[i][j]);       }
}int main()
{//freopen("input.txt", "r", stdin);init();scanf("%d%d%d", &n, &m, &people);for (int i = 1; i <= m; i++){int x, y, z;scanf("%d%d%d", &x, &y, &z);if (z < map[x][y])map[x][y] = map[y][x] = z;}build(2 * n + 1, 2 * n + 2);printf("%d\n", solve(2 * n + 1, 2 * n + 2));
}

转载于:https://www.cnblogs.com/mengfanrong/p/3845444.html

[BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘相关推荐

  1. 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...

  2. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理

    准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...

  3. [bzoj2324][ZJOI2011]营救皮卡丘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的 ...

  4. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  5. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  6. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  7. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  8. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  9. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

最新文章

  1. 线上分享会预告之深度学习在3D场景中的应用
  2. 2021年码农应该了解的所有机器学习算法
  3. OS X 使用技巧——不用鼠标就能打开应用程序
  4. Redis 是并发安全的吗?你确定?
  5. winform界面嵌入dwg图纸_c# cad中插入另一个dwg的图块
  6. 【学习笔记】吴恩达机器学习 WEEK 0
  7. DELPHI编程环境
  8. 近期GitHub上最热门的开源项目(附链接)
  9. 《Java技术》第二次作业计科1501赵健宇
  10. java学习笔记16--异常
  11. RedMonk 2020 年 Q3 编程语言排行:Python力压Java和PHP,Rust 首次进入前 20
  12. R和RStudio下载安装详细步骤
  13. mysql主主复制和mha_MySQL第二章主从复制MHA高可用
  14. 算法总结之 在数组中找到一个局部最小的位置
  15. WEBMAX功能简述
  16. PHP 快递地图模式,使用D3.js创建物流地图的步奏详解
  17. linux系统 ubuntu 使用GWE图形用户界面调整显卡风扇转速曲线
  18. BOTTON控件介绍及程序基本框架与皮肤自定义
  19. 《娱乐至死》读书笔记(part1)--深入一种文化的最有效途径是了解这种文化中用于会话的工具
  20. 关于word页眉页脚的设置-页码不连续的问题

热门文章

  1. SVM学习(续)核函数 松弛变量和惩罚因子
  2. 《HTTPS权威指南》- SSL、TLS和密码学学习笔记
  3. ArcSDE初学者需要弄清楚的几个问题(转载)
  4. C# 时间函数(几个常用时间,程序运行计时,页面运行计时)
  5. Android 入职感想
  6. 【android】窗口管理
  7. 【Redis】4.Redis数据存储listsetsorted_set
  8. 第二十二章:动画(八)
  9. Python定义点击右上角关闭按钮事件
  10. Springboot跨域 ajax jsonp请求