P4568 [JLOI2011]飞行路线

分层图模板题,相似的题还有P4822 [BJWC2012]冻结P2939 [USACO09FEB]改造路Revamping Trails,其实做惯了也就不难了。。

为什么有这篇题解?

  • 感觉写的比较简洁清晰

  • 线段树优化最短路

一、堆优化dijkstra

652ms / 25.58MB / 1.31KB C++

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int MAXN=110005,MAXM=2500001;
struct edge {
int to,dis,next;
} e[MAXM];
int n,m,k,s,t,head[MAXN],dis[MAXN],cnt;
bool vis[MAXN];
struct node {
int dis,pos;
bool operator <(const node &x)const {
return x.dis<dis;
}
};
priority_queue<node> q;
inline void add_edge(int u,int v,int d) {
e[++cnt].dis=d;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void dijkstra() {
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push((node) {
0,s
});
while(!q.empty()) {
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if (vis[x]) continue;
vis[x]=1;
for (int i=head[x]; i; i=e[i].next) {
int y=e[i].to;
if (dis[y]>dis[x]+e[i].dis) {
dis[y]=dis[x]+e[i].dis;
if (!vis[y])
q.push((node) {
dis[y],y
});
}
}
}
}
int main() {
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
for (register int i=0; i<m; i++) {
register int u,v,d;
scanf("%d%d%d",&u,&v,&d);
add_edge(u,v,d),add_edge(v,u,d);
for(int j=1; j<=k; ++j) {
add_edge(u+(j-1)*n,v+j*n,0);
add_edge(v+(j-1)*n,u+j*n,0);
add_edge(u+j*n,v+j*n,d);
add_edge(v+j*n,u+j*n,d);
}//每层之间建边
}
for(int i=1; i<=k; ++i) {
add_edge(t+(i-1)*n,t+i*n,0);//每层终点连边(不一定用K次最优)
}
dijkstra();
printf("%d",dis[k*n+t]);
return 0;
}

二、线段树dijkstra

523ms / 26.64MB / 1.41KB C++

#include<cstdio>
#include<cstring>
using namespace std;
const int N=110005,M=2500001;
int n,m,kth,cnt,s,t;
int tr[N<<2],h[N],nxt[M],to[M],w[M],dis[N];
#define R register int
inline int rd() {
int t=0;
char c=getchar();
while(c<'0' || c>'9') c=getchar();
while(c>='0' && c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
return t;
}
inline void add_edge(int u,int v,int _w) {
nxt[++cnt]=h[u],to[cnt]=v,w[cnt]=_w,h[u]=cnt;
}
#define min(a,b) (dis[a]<dis[b]? a:b)
inline void modify(int o,int l,int r,int pos,int val) {
if (l==r) {
tr[o]=val;
return;
}
int mid=l+r>>1;
if (pos<=mid) modify(o<<1,l,mid,pos,val);
else modify(o<<1|1,mid+1,r,pos,val);
tr[o]=min(tr[o<<1],tr[o<<1|1]);
}
inline void dijkstra() {
memset(dis,0x3f,sizeof(dis));
dis[s]=0,modify(1,1,kth*n,s,s);//线段树存点的编号,然后通过比较dis上传
for (R t=1,u,v; t<kth*n; t++) {
u=tr[1],modify(1,1,kth*n,u,0);//dis0始终保持0x3f,作为删除操作
for (R i=h[u]; i; i=nxt[i])
if (dis[v=to[i]]>dis[u]+w[i])
dis[v]=dis[u]+w[i],modify(1,1,kth*n,v,v);
}
}
int main() {
n=rd(),m=rd(),kth=rd(),s=rd()+1,t=rd()+1;//编号加1,空出dis0的位置
for (R i=1,u,v,_w; i<=m; i++) {
u=rd()+1,v=rd()+1,_w=rd();
add_edge(u,v,_w),add_edge(v,u,_w);
for(int j=1; j<=kth; ++j) {
add_edge(u+(j-1)*n,v+j*n,0);
add_edge(v+(j-1)*n,u+j*n,0);
add_edge(u+j*n,v+j*n,_w);
add_edge(v+j*n,u+j*n,_w);
}
}
for (R i=1;i<=kth;i++)
add_edge(t+(i-1)*n,t+i*n,0);
kth++;
dijkstra();
printf("%d",dis[(kth-1)*n+t]);
return 0;
}

三、DP最短路

296ms / 2.26MB / 1.15KB C++

这种方法最快,而且数组的范围比较好确定

注意dis,vis,node是二维,要记录点的编号和所用次数

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct edge {
int v,w,h;
} e[100010];
int n,m,K,s,t,cnt,ans,h[10010],d[10010][11];
bool vis[10010][11];
struct node {
int u,k;
bool operator <(const node &x) const {
return d[u][k]>d[x.u][x.k];
}
};
inline void add(int u,int v,int w) {
e[++cnt]=(edge) {v,w,h[u]},h[u]=cnt;
}
inline void dijkstra() {
priority_queue<node> q;
memset(d,0x3f,sizeof d);
q.push((node) {
s,0
}),d[s][0]=0,vis[s][0]=1;//s点,用了0次
while(!q.empty()) {
node x=q.top();
q.pop(),vis[x.u][x.k]=0;
for (register int i=h[x.u],v,u,k; i; i=e[i].h) {
if (d[v=e[i].v][k=x.k]>d[u=x.u][k]+e[i].w) {
d[v][k]=d[u][k]+e[i].w;
if (!vis[v][k]) q.push((node) {
v,k
}),vis[v][k]=1;
}//更新不使用的情况,k不变
if (d[v][k+1]>d[u][k] && k<K) {
d[v][k+1]=d[u][k];
if (!vis[v][k+1] && k<K) q.push((node) {
v,k+1
}),vis[v][k+1]=1;
}//更新使用的情况,k加1且小于K
}
}
}
int main() {
scanf("%d%d%d%d%d",&n,&m,&K,&s,&t);
for (int i=1,u,v,w; i<=m; i++)
scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w);
dijkstra();
ans=1e9;
for (int i=0; i<=K; i++)
ans=ans<d[t][i]? ans:d[t][i];//用几次最优
printf("%d",ans);
}

题解 P4568 【[JLOI2011]飞行路线】的更多相关文章

  1. 洛谷 P4568 [JLOI2011]飞行路线 题解

    P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为\(0\)到\( ...

  2. 洛谷 P4568 [JLOI2011]飞行路线 解题报告

    P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为0到\(n−1\ ...

  3. 【luogu P4568 [JLOI2011]飞行路线】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...

  4. 洛谷 P4568 [JLOI2011]飞行路线

    题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...

  5. [洛谷P4568][JLOI2011]飞行路线

    题目大意:最短路,可以有$k$条边无费用 题解:分层图最短路,建成$k$层,层与层之间的边费用为$0$ 卡点:空间计算出错,建边写错 C++ Code: #include <cstdio> ...

  6. P4568 [JLOI2011]飞行路线 分层图最短路

    思路:裸的分层图最短路 提交:1次 题解: 如思路 代码: #include<cstdio> #include<iostream> #include<cstring> ...

  7. luogu P4568 [JLOI2011]飞行路线

    传送门 看到免费次数\(k\)最多只有10,可以考虑构建\(k+1\)层的分层图,即每一层正常连边,上下两层对应点连边权为0的单向边,最后对所有层里面的\(di_t\)取\(\max\)救星了 #in ...

  8. P4568 [JLOI2011]飞行路线

    思路 套路题 建出k+1分层图,从上一层走到下一层代表坐了一次免费航线,跑最短路即可 注意可能有情况不需要耗完所有k次机会,所以应从每层的终点向下一层终点连一条边权为0的边 代码 #include & ...

  9. P4568 [JLOI2011]飞行路线(分层图)

    机房dalao推荐写的...(标签分层图) 经过前几题的分层图的洗礼,我深刻地体会到了分层图的优点和好处(主要是不想打dp....) 先说题吧.... 很明确,模型是最短路,但是,怎么跑k个,是个问题 ...

  10. P4568 [JLOI2011]飞行路线 分层图

    题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在nn个城市设有业务,设这些城市分别标记为00到n-1n−1,一共有mm种航线,每种航线连接两个城市,并且 ...

随机推荐

  1. 前端Css学习

    CSS 称为层叠样式表 css样式引入方式 第一种 head标签中引入 <style> /* 选择器{css属性名称:属性值;css属性名称:属性值;} */ div{ /* css注释 ...

  2. date-fns时间库的基本使用

    在react中使用date-fns: import sub_days from 'date-fns/sub_days'; import start_of_week from 'date-fns/sta ...

  3. 小匠第二周期打卡笔记-Task03

    一.过拟合欠拟合及其解决方案 知识点记录 模型选择.过拟合和欠拟合: 训练误差和泛化误差: 训练误差 :模型在训练数据集上表现出的误差, 泛化误差 : 模型在任意一个测试数据样本上表现出的误差的期望, ...

  4. openresty入门文章(笔者自用)

    推荐好的openresty入门介绍文章:https://www.cnblogs.com/digdeep/p/4859575.html  

  5. [HEOI2016] 字符串 - 后缀数组,主席树,ST表,二分

    [HEOI2016] 字符串 Description 给定一个字符串 \(S\), 有 \(m\) 个询问,每个询问给定参数 \((a,b,c,d)\) ,求 \(s[a..b]\) 的子串与 \(s ...

  6. how to activate XMind8 to pro version.

    From activate Xmind 8. in step 3: run ./setup.sh in sudo command, and use the following command to r ...

  7. SpringMVC 配置.html拦截时,返回JSON数据时出现406错误解决方案

    [说明]在SpringMVC框架的使用中常常会使用@ResponseBody注解,修饰"处理器"(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回 ...

  8. JS定义类的六种方式详解

    转载自: http://www.jb51.net/article/84089.htm 在前端开发中,经常需要定义JS类.那么在JavaScript中,定义类的方式有几种,分别是什么呢?本文就JS定义类 ...

  9. java fastjson:Map与json以及JSONObject ,JSONObject与String互转

    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson ...

  10. Photoshop——APP设计规范

    随着Android和iOS语言的兴起,能够在手机上运行的APP软件已经成为了目前移动应用技术的焦点,APP的UI设计随之也越来越受到重视. 用户的需求不断增加,技术也在不断的更新,UI设计也越来越被重 ...