【洛谷P4568】[JLOI2011]飞行路线
飞行路线
今天上午模拟考试考了原题,然而数组开小了,爆了4个点。
据王♂强dalao说这是一道分层图SPFA的裸题
dis[i][j]表示到点i用k个医疗包的最小消耗,dis[u][j]+e[i].w更新dis[v][j],
dis[u][j]更新dis[v][j+1]
然而它卡SPFA,会TLE几个点
于是就有了堆优化SPFA。。(它就是堆优化dijkstra。。)
#include<cstring>
#include<cstdio>
#include<queue>
#define INF 0x3f3f3f3f
#define N 10010
int n,m,k,s,t,ans=INF;
int dis[N][];
struct HA{
int pos,cost,times;
};
struct cmp{
bool operator()(HA x,HA y){
return x.cost==y.cost?x.times>y.times:x.cost>y.cost;
}
};
std::priority_queue< HA, std::vector<HA>, cmp > q;
bool vis[N][];
int Head[N],num;
struct NODE{
int to,w,next;
} e[];
const int ch_top=4e7+;
char ch[ch_top],*now_r=ch-,*now_w=ch-;
inline int read(){
while(*++now_r<'');
register int x=*now_r-'';
while(*++now_r>='')x=x*+*now_r-'';
return x;
}
inline void write(int x){
static char st[];static int top;
while(st[++top]=''+x%,x/=);
while(*++now_w=st[top],--top);
*++now_w='\n';
}
void SPFA(){
memset(dis,0x3f,sizeof(dis));
for(int i=;i<=k;i++){
dis[s][i]=;
q.push((HA){s,,i});
}
while(!q.empty()){
int u=q.top().pos,f=q.top().times;
q.pop();
vis[u][f]=;
for(int i=Head[u];i;i=e[i].next){
int v=e[i].to;
if(dis[v][f]>dis[u][f]+e[i].w){
dis[v][f]=dis[u][f]+e[i].w;
if(!vis[v][f]){
vis[v][f]=;
q.push(HA{v,dis[v][f],f});
}
}
if(f<k&&dis[v][f+]>dis[u][f]){
dis[v][f+]=dis[u][f];
if(!vis[v][f+]){
vis[v][f+]=;
q.push(HA{v,dis[v][f+],f+});
}
}
}
}
}
int main()
{
fread(ch,,ch_top,stdin);
n=read(); m=read(); k=read();
s=read(); t=read();
int x,y,w;
for(int i=;i<=m;i++){
x=read(); y=read(); w=read();
e[++num].to=y;
e[num].w=w;
e[num].next=Head[x];
Head[x]=num;
e[++num].to=x;
e[num].w=w;
e[num].next=Head[y];
Head[y]=num;
}
SPFA();
write(dis[t][k]);
fwrite(ch,,now_w-ch,stdout);
return ;
}
【洛谷P4568】[JLOI2011]飞行路线的更多相关文章
- 洛谷 P4568 [JLOI2011]飞行路线 解题报告
P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为0到\(n−1\ ...
- 洛谷 P4568 [JLOI2011]飞行路线 题解
P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为\(0\)到\( ...
- 洛谷 P4568 [JLOI2011]飞行路线
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- [洛谷P4568][JLOI2011]飞行路线
题目大意:最短路,可以有$k$条边无费用 题解:分层图最短路,建成$k$层,层与层之间的边费用为$0$ 卡点:空间计算出错,建边写错 C++ Code: #include <cstdio> ...
- 洛谷 4568 [JLOI2011] 飞行路线
题目戳这里 一句话题意: 有n个点,m条边的有向图,最多可以把k条边变为0,求从起点到终点最短距离. Solution 首先看到这题目,感觉贼难,看起来像DP,貌似也有大佬这么做,但鉴于本蒟蒻思维能力 ...
- 【洛谷 P4568】 [JLOI2011]飞行路线 (分层最短路)
题目链接 分层图最短路. 把每个点拆成\(k+1\)个点,表示总共有\(k+1\)层. 然后每层正常连边, 若\((u,v)\)有边,则把每一层的\(u\)和下一层的\(v\).每一层的\(v\)和下 ...
- 洛谷P4568 飞行路线
题目描述 \(Alice\)和\(Bob\)现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为\(0\)到\(n−1\),一共有\(m\ ...
- 【luogu P4568 [JLOI2011]飞行路线】 题解
题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...
- luogu P4568 [JLOI2011]飞行路线
传送门 看到免费次数\(k\)最多只有10,可以考虑构建\(k+1\)层的分层图,即每一层正常连边,上下两层对应点连边权为0的单向边,最后对所有层里面的\(di_t\)取\(\max\)救星了 #in ...
随机推荐
- Kibana修改Time日志格式
选择左侧management 打开Advanced Settings 编辑:dateFormat,默认格式是:MMMM Do YYYY, HH:mm:ss.SSS,修改为:YYYY-MM-DD HH: ...
- ionic resources
下面是我在使用ionic,cordova,angularjs的时候经常使用的资源. ionic css components cordova documentation ionic icons ngC ...
- 使用SeaJS实现模块化JavaScript开发【转】
前言 SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,SeaJS不会扩展封 ...
- C#的split()分割字符串
简单的说: 在C#中 str.Split("===="); //这样是错误的,只能 str.Split('=');//参数只能是char类型的,不能是字符串的 如果非得要以字符串分 ...
- 【转】Python中不尽如人意的断言Assertion
原文地址:Python中不尽如人意的断言Assertion Python Assert 为何不尽如人意 Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛 ...
- 九度oj题目1014:排名
题目1014:排名 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8130 解决:2417 题目描述: 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排 ...
- 记自己的hexo个人博客
https://othercoding.github.io/
- 调用sqlserver中的存储过程
1.存储过程名 string strSQL = "usp_GetUnReturnPassports"; 2.创建数据库对象 database Database db = Datab ...
- 2017年10月9日 冒泡&去重复习
今天看了一下,就是数组跟js还是不太熟悉 冒泡排序 var arr = [4, 2, 1, 3, 6, 5]; for(var i = 1; i < arr.length; ...
- 小米3 无法显示日志 Logcat
需要ROOT权限 1. 使用文件浏览器进入 /system/etc/init.d/ 目录 2.使用文本编辑器打开里面的 01Supertweak 这个文件 在最下面找到 rm /dev/lo ...