BZOJ2324: [ZJOI2011]营救皮卡丘
2324: [ZJOI2011]营救皮卡丘
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1359 Solved: 522
[Submit][Status]
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个人所经过的道路的长度总和最少。
请你帮助小智设计一个最佳的营救方案吧!
Input
第一行包含三个正整数N,M,K。表示一共有N+1个据点,分别从0到N编号,以及M条无向边。一开始小智一行共K个人均位于0号点。
接下来M行,每行三个非负整数,第i行的整数为Ai,Bi,Li。表示存在一条从Ai号据点到Bi号据点的长度为Li的道路。
Output
仅包含一个整数S,为营救皮卡丘所需要经过的最小的道路总和。
Sample Input
0 1 1
1 2 1
2 3 100
0 3 1
Sample Output
【样例说明】
小智和小霞一起前去营救皮卡丘。在最优方案中,小智先从真新镇前往1号点,接着前往2号据点。当小智成功摧毁2号据点之后,小霞从真新镇出发直接前往3号据点,救出皮卡丘。
HINT
对于10%的数据满足 K = 1,且N = 3,小智将独自前去营救皮卡丘;
对于20%的数据满足 K ≤ 3,且N ≤ 20,被小智单挑剿灭的火箭队加强了防御,增加了据点数;
对于40%的数据满足 K ≤ 3,且N ≤ 100,面对加强的防御,小智拉来了好朋友小霞和小刚,一同前去营救;
对于另外20%的数据满足任意一对据点之间均存在道路,并且对任意的0 ≤ X,Y,Z ≤ N,有不等式L(X,Z) ≤ L(X,Y) + L(Y,Z)成立;
对于100%的数据满足N ≤ 150, M ≤ 20 000, 1 ≤ K ≤ 10, Li ≤ 10 000, 保证小智一行一定能够救出皮卡丘。
至于为什么K ≤ 10,你可以认为最终在小智的号召下,小智,小霞,小刚,小建,小遥,小胜,小光,艾莉丝,天桐,还有去日本旅游的黑猫警长,一同前去大战火箭队。
Source
题解:
这题和星际竞速还有打印机两题的主体思路都是一样的
每个点一定要经过,并且要经过这个点,必须经过比这个点小的所有点。而且还存在一个附加源,但源到附加源有一定的容量限制(星际没有。。。)
这题我们采用如下方式建图:
1.把每个点拆成 i 和 i+n 两个点,分别表示从这个点出发和进入这个点
2.由s向所有i 连容量为1,费用为0的边
2.由所有i+n到t连容量为1,费用为0的边
3.由 i 向所有 j+n(j>n)连容量为1,费用为从 i 到 j,不经过比j标号大的中间节点的最短路 的边 (否则这条道路将不合法)
正确性可以从i+n 入流的来源来考虑,每一种流法都代表着一种实实在在的、合法的方案,cost就是花费时间,我们要时间最短,自然要最小费用最大流了
还有一个问题就是
费用为从 i 到 j,不经过比j标号大的中间节点的最短路 怎么求?
我自己yy了一种想法,如下:
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=k;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
意思就是不使用比 j 大的节点作为中间节点来更新 i(1..n)到j的最短路
所以这个过程结束后,f[i][j]就代表着从 i 到 j不经过比 j大的节点的最短路
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define inf 1000000000
#define maxn 500
#define maxm 100000
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,k,tot=,s,t,ss,head[maxn],q[maxn],from[maxn],f[maxn][maxn];
bool v[maxn];
ll d[maxn],mincost;
struct edge{int from,next,go,v,c;}e[*maxm];
void ins(int x,int y,int z,int w)
{
e[++tot].go=y;e[tot].from=x;e[tot].v=z;e[tot].c=w;e[tot].next=head[x];head[x]=tot;
}
void insert(int x,int y,int z,int w)
{
ins(x,y,z,w);ins(y,x,,-w);
}
bool spfa()
{
for (int i=s;i<=ss;i++)d[i]=inf;
memset(v,,sizeof(v));
int l=,r=,y;q[]=s;d[s]=;v[]=;
while(l!=r)
{
int x=q[++l];if(l==maxn)l=;v[x]=;
for (int i=head[x];i;i=e[i].next)
if(e[i].v&&d[x]+e[i].c<d[y=e[i].go])
{
d[y]=d[x]+e[i].c;from[y]=i;
if(!v[y]){v[y]=;q[++r]=y;if(r==maxn)r=;}
}
}
return d[t]!=inf;
}
void mcf()
{
while(spfa())
{
int tmp=inf;
for(int i=from[t];i;i=from[e[i].from]) tmp=min(tmp,e[i].v);
mincost+=d[t]*tmp;
for(int i=from[t];i;i=from[e[i].from]){e[i].v-=tmp;e[i^].v+=tmp;}
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();m=read();k=read();
memset(f,,sizeof(f));
for(int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
f[x][y]=min(f[x][y],z);f[y][x]=min(f[y][x],z);
}
s=;t=*n+;ss=*n+;insert(s,ss,k,);
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=k;j<=n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
for(int i=;i<=n;i++)insert(s,i,,);
for(int i=;i<=n;i++)insert(ss,i+n,,f[][i]);
for(int i=;i<=n;i++)insert(i+n,t,,);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
insert(i,j+n,,f[i][j]);
mcf();
printf("%lld\n",mincost);
return ;
}
BZOJ2324: [ZJOI2011]营救皮卡丘的更多相关文章
- bzoj2324 [ZJOI2011]营救皮卡丘 费用流
[ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2653 Solved: 1101[Submit][Status][D ...
- BZOJ2324 [ZJOI2011]营救皮卡丘 【费用流】
题目 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道 ...
- BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)
虽然不一定每次都是由编号小的点向编号大的走,但一个人摧毁的顺序一定是从编号小的到编号大的.那么在摧毁据点x的过程中,其只能经过编号小于x的点.并且这样一定合法,因为可以控制其他人先去摧毁所经过的点.那 ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘(网络流,费用流)
[BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流
[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的 ...
- bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)
2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1777 Solved: 712[Submit][Stat ...
- BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )
昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1 ...
- P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)
P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞 先跑一遍Floyd处理出$dis[i][j]$ 注意到走 ...
- 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流
原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...
随机推荐
- iOS UI布局调试工具
查看ios软件的ui布局有三种: 1.DCIntrospect 这种方式是开源的,我从github上clone下来后运行demo,运行遇到了问题:Xcode cannot run using t ...
- Java基础知识强化之IO流笔记09:File类功能
详见如下: Android(java)学习笔记87:File类使用
- 500 OOPS: vsftpd: refusing to run with writable root inside chroot()解决方法
vsftpd.conf配置文件如下: [root@rusky ~]# cat /etc/vsftpd/vsftpd.conf | grep -v "#" anonymous_ena ...
- .NET 拼音检索
微软提供了一个Visual Studio International Pack 组件,可以转换简繁体,或者将汉字转换为拼音以及其他语言的支持. https://www.microsoft.com/zh ...
- Python自动化之5种session类型
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session Django默认支持Se ...
- noip 2013 华容道
/*双向bfs (得分和单项的一样多....)70*/ #include<iostream> #include<cstdio> #include<cstring> ...
- C#学习第二天
在C#中数据类型大概有两类:值类型和引用类型,需要由定义类型的开发人员决定在什么地方分配一个实例. 值类型和引用类型在使用原理上也有所不同,值类型在使用时是传递或者得到一个值的副本,而引用类型在使用时 ...
- MySQL存储过程的基本函数(三)
(1).字符串类 首先定义一个字符串变量:set @str="lxl"; CHARSET(str) //返回字串字符集 select charset(@str);+-------- ...
- canvas --> getImageData()
getImageData() 使用时有跨域问题 设置img的属性 crossOrigin="anonymous"可解决crossOrigin的问题 <img src=&quo ...
- word2vec生成词向量原理
假设每个词对应一个词向量,假设: 1)两个词的相似度正比于对应词向量的乘积.即:$sim(v_1,v_2)=v_1\cdot v_2$.即点乘原则: 2)多个词$v_1\sim v_n$组成的一个上下 ...