原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html


题目描述

皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路。

火箭队一共有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个人所经过的道路的长度总和最少。

请你帮助小智设计一个最佳的营救方案吧!

输入

第一行包含三个正整数N,M,K。表示一共有N+1个据点,分别从0到N编号,以及M条无向边。一开始小智一行共K个人均位于0号点。

接下来M行,每行三个非负整数,第i行的整数为Ai,Bi,Li。表示存在一条从Ai号据点到Bi号据点的长度为Li的道路。

输出

仅包含一个整数S,为营救皮卡丘所需要经过的最小的道路总和。

样例输入

3 4 2
0 1 1
1 2 1
2 3 100
0 3 1

样例输出

3


题解

最短路-Floyd+有上下界费用流

先用Floyd求出任意两点间距离,注意这里的路径是带有条件的,若为i与j之间的距离,则中间枚举点k必须满足k<=i或k<=j。

因为必须在编号小的点都被摧毁的条件下才能算编号大的点的路径。

这样就求出了题目条件下的两点最短路。

然后就转化为类似于 bzoj1927 的问题,拆点费用流即可。

#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
queue<int> q;
int map[160][160] , head[400] , to[100000] , val[100000] , cost[100000] , next[100000] , cnt = 1 , s , t , dis[400] , from[400] , pre[400];
void add(int x , int y , int v , int c)
{to[++cnt] = y , val[cnt] = v , cost[cnt] = c , next[cnt] = head[x] , head[x] = cnt;to[++cnt] = x , val[cnt] = 0 , cost[cnt] = -c , next[cnt] = head[y] , head[y] = cnt;
}
bool spfa()
{int x , i;memset(dis , 0x3f , sizeof(dis));memset(from , -1 , sizeof(from));dis[s] = 0 , q.push(s);while(!q.empty()){x = q.front() , q.pop();for(i = head[x] ; i ; i = next[i])if(val[i] && dis[to[i]] > dis[x] + cost[i])dis[to[i]] = dis[x] + cost[i] , from[to[i]] = x , pre[to[i]] = i , q.push(to[i]);}return ~from[t];
}
int mincost()
{int ans = 0 , i , k;while(spfa()){k = inf;for(i = t ; i != s ; i = from[i]) k = min(k , val[pre[i]]);ans += dis[t] * k;for(i = t ; i != s ; i = from[i]) val[pre[i]] -= k , val[pre[i] ^ 1] += k;}return ans;
}
int main()
{int n , m , p , i , j , k , x , y , z;scanf("%d%d%d" , &n , &m , &p);memset(map , 0x3f , sizeof(map));while(m -- ) scanf("%d%d%d" , &x , &y , &z) , map[x][y] = map[y][x] = min(map[x][y] , z);for(k = 0 ; k <= n ; k ++ )for(i = 0 ; i <= n ; i ++ )for(j = 0 ; j <= n ; j ++ )if((k <= i || k <= j) && map[i][j] > map[i][k] + map[k][j])map[i][j] = map[i][k] + map[k][j];s = 2 * n + 2 , t = 2 * n + 3 , add(2 * n + 1 , 0 , p , 0);for(i = 1 ; i <= n ; i ++ ) add(0 , i , inf , map[0][i]);for(i = 1 ; i <= n ; i ++ ){add(s , i + n , 1 , 0) , add(i , t , 1 , 0) , add(i + n , 2 * n + 1 , inf , 0);for(j = i + 1 ; j <= n ; j ++ )if(map[i][j] != inf)add(i + n , j , inf , map[i][j]);}printf("%d\n" , mincost());return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/6832504.html

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

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

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

  2. [ZJOI2011]营救皮卡丘(费用流 + 最短路)

    problem luogu-P4542 solution 刚开始就直观感觉 dpdpdp 不动,却有个看似"理所当然"的贪心:每次跑 kkk 个人所在点到扩展据点的最短距离,然后让 ...

  3. BZOJ 2324: [ZJOI2011]营救皮卡丘(带上下限的最小费用最大流)

    这道题么= =还是有些恶心的,第一次写带上下界的网络流,整个人都萌萌哒~~~ 首先先预处理得最短路后 直接用费用流做就行了. 第一次写,还是挺好写的= = CODE: #include<cstd ...

  4. 【BZOJ2324】营救皮卡丘,费用流

    传送门 写在前面:内心充满波动 思路: 题目有几个关键点: 1.每一个点都必须有人经过 2.经过j点时,0~j-1必须都经过了才可以 由此可以构造出一个网络流的模型. 由于每个节点的第一次访问,必定是 ...

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

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

  6. [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘

    [Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队 ...

  7. P4542-[ZJOI2011]营救皮卡丘【费用流,Floyd】

    正题 题目链接:https://www.luogu.com.cn/problem/P4542 题目大意 给出n+1n+1n+1个点mmm条边的无向图,kkk个人开始在000号点,一个人进入iii号点之 ...

  8. python皮卡丘字符打印代码,python画皮卡丘的代码

    大家好,本文将围绕用python画一只可爱的皮卡丘展开说明,python皮卡丘字符打印代码是一个很多人都想弄明白的事情,想搞清楚python皮卡丘编程代码教程需要先了解以下几个事情. 1.python ...

  9. 皮卡丘为什么不进化_宝可梦:为何23年来小智的皮卡丘无法进化?怎样分辨皮卡丘性别?...

    精灵宝可梦是一部非常古老的IP,它的第一版游戏发售于1996年,第一部动画放送于1997年,在那个年代,不少漫迷都还没有出生吧! 说到宝可梦,大家脑海中出现的第一个精灵形象很可能是皮卡丘,毕竟它是知名 ...

最新文章

  1. SEO查询指令,非常值得你收藏!
  2. 阿里二面:GET 请求能传图片吗?
  3. 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致,很是郁闷,诡异...
  4. 【Python】这款拓展让你的jupyter lab使用更高效
  5. Consul入门04 - Consul集群 1
  6. GDI+有Bitmap类。
  7. [vue] 在vue项目中如何配置favicon?
  8. 为什么使用NativeJdbcExtractor
  9. xp桌面计算机隐藏设置方法,匿于无形 WindowsXP系统隐藏技巧大放送
  10. DevExpress v17.2新版亮点——XAF篇
  11. linux系统编程 -- 僵尸进程 孤儿进程
  12. ElasticNet算法解析
  13. php7+结合比较运算符,php7运算符
  14. android 垂直方向布局,Android详解4种基本布局
  15. 概念模型、逻辑模型及物理模型介绍
  16. 开源项目—swift开发记事本APP
  17. h61 nvme硬盘_让SSD起飞,玩转固态硬盘工具
  18. coc跑团san数值规则_【规则】克苏鲁coc跑团游戏术语/黑话,第三篇教学。
  19. 小米出品——gRPC Name Resolver 原理及实践
  20. SpringApplicationRunListener

热门文章

  1. IPFS网络是如何运行的(p2p网络)
  2. 深入了解以太坊虚拟机第2部分——固定长度数据类型的表示方法
  3. Ehcache存储策略总结
  4. 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别
  5. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
  6. Qt Dock Widgets 官方示例的翻译
  7. 顺序的分数 Ordered Fractions
  8. 微型计算机显示器引线,微型计算机的显示器通常有两组引线,即分别是( )...
  9. 装载向导_麦德美爱法:异构集成时代的高阶封装载板金属化工艺
  10. centos linux内核编译环境,CENTOS linux kernel 内核编译