bzoj2763 [JLOI2011]飞行路线——分层图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763
构建分层图。
代码如下:
写法1(空间略大)(时间很慢):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<pair<int,int> >q;
int const maxn=2e5+,maxm=;
int n,m,k,s,t,head[maxn],ct,dis[maxn];
bool vis[maxn];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxm<<];
void add(int x,int y,int z)
{
edge[++ct]=N(y,head[x],z); head[x]=ct;
edge[++ct]=N(x,head[y],z); head[y]=ct;
for(int i=;i<=k-;i++)
{
int u=x+i*n,v=y+(i+)*n;
edge[++ct]=N(v,head[u],); head[u]=ct;
u=y+i*n,v=x+(i+)*n;
edge[++ct]=N(v,head[u],); head[u]=ct;
u=x+(i+)*n,v=y+(i+)*n;
edge[++ct]=N(v,head[u],z); head[u]=ct;
edge[++ct]=N(u,head[v],z); head[v]=ct;
}
}
void dijkstra()
{
memset(dis,0x3f,sizeof dis);
dis[s]=; q.push(make_pair(,s));
while(q.size())
{
int x=q.top().second; q.pop();
while(vis[x]&&q.size())x=q.top().second,q.pop();
if(vis[x])break; vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[x]+edge[i].w)
{
dis[u]=dis[x]+edge[i].w;
q.push(make_pair(-dis[u],u));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
t+=k*n;
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dijkstra();
printf("%d",dis[t]);
return ;
}
写法2(空间小)(时间飞快)(bfs)(dijkstra?):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int const maxn=,maxm=;
struct P{
int bh,d,f;
P(int b=,int d=,int f=):bh(b),d(d),f(f) {}
bool operator < (const P &y) const
{
return d>y.d;//priority_queue 是从大到小排序
}
};
priority_queue<P>q;
int n,m,K,head[maxn],ct,s,t,dis[maxn][];
bool vis[maxn][];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxm<<];
void add(int x,int y,int z){edge[++ct]=N(y,head[x],z); head[x]=ct;}
void bfs()
{
memset(dis,0x3f,sizeof dis);
dis[s][]=; q.push(P(s,,));
while(q.size())
{
int x=q.top().bh, d=q.top().d, f=q.top().f; q.pop();
if(vis[x][f])continue;
vis[x][f]=;
if(x==t)
{
printf("%d",d); return;
}
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(f<K&&dis[u][f+]>d&&!vis[u][f+])
{
dis[u][f+]=d;
q.push(P(u,d,f+));
}
if(dis[u][f]>d+edge[i].w&&!vis[u][f])
{
dis[u][f]=d+edge[i].w;
q.push(P(u,dis[u][f],f));
}
}
}
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&K,&s,&t);
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
bfs();
return ;
}
bzoj2763 [JLOI2011]飞行路线——分层图的更多相关文章
- bzoj2763: [JLOI2011]飞行路线(分层图spfa)
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3234 Solved: 1235[Submit][Stat ...
- BZOJ2763[JLOI2011]飞行路线 [分层图最短路]
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2523 Solved: 946[Submit][Statu ...
- BZOJ2763: [JLOI2011]飞行路线(分层图 最短路)
题意 题目链接 Sol 分层图+最短路 建\(k+1\)层图,对于边\((u, v, w)\),首先在本层内连边权为\(w\)的无向边,再各向下一层对应的节点连边权为\(0\)的有向边 如果是取最大最 ...
- bzoj2763: [JLOI2011]飞行路线 分层图+dij+heap
分析:d[i][j]代表从起点到点j,用了i次免费机会,那就可以最短路求解 #include <stdio.h> #include <iostream> #include &l ...
- [bzoj2763][JLOI2011]飞行路线——分层图最短路
水题.不多说什么. #include <bits/stdc++.h> using namespace std; const int maxn = 10010; const int maxk ...
- bzoj2763 [JLOI]飞行路线 分层图最短路
问题描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- 【bzoj2763】[JLOI2011]飞行路线 分层图最短路
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MB Description Alice和Bob现在要乘飞机旅行,他们选择了一家相 ...
- [BZOJ2963][JLOI2011]飞行路线 分层图+spfa
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
随机推荐
- 修改 root密码
sudo su #切换到root账户sudo passwd root #输入密码
- 86-Money Flow Index 资金流量指数指标.(2015.7.3)
Money Flow Index 资金流量指数指标 计算: 1.典型价格(TP)=当日最高价.最低价与收盘价的算术平均值 2.货币流量(MF)=典型价格(TP)×N日内成交金额 3.如果当日MF> ...
- phtyon,通过while循环简单的用户名和密码登录
_username='zhangxin' _password='abc123' _username1='zhaopeng' _password1='abc1234' _username2=" ...
- Python之条件 循环和其他语句 2014-4-6
#条件 循环和其他语句 23:30pm-1:431.print和import的更多信息 使用逗号将多个表达式输出 >>> print 'age:',42 age: 42 >&g ...
- [ C语言 ] 迷宫 迷宫生成器 [ 递归与搜索 ]
[原创]转载请注明出处 [浙江大学 程序设计专题] [地图求解器] 本题目要求输入一个迷宫地图,输出从起点到终点的路线. 基本思路是从起点(Sx,Sy)每次枚举该格子上下左右四个方向,直到走到终点(T ...
- Thinkphp5.0 控制器向视图view赋值
Thinkphp5.0 控制器向视图view的赋值 方式一(使用fetch()方法的第二个参数赋值): <?php namespace app\index\controller; use thi ...
- cogs——73. 找最佳通路
73. 找最佳通路 ★☆ 输入文件:city.in 输出文件:city.out 简单对比时间限制:1 s 内存限制:128 MB 问题描述有 n 个 城市,它们之间的交通情况已知.现在 ...
- Git回退---reset和revert
今天学习了git回退的两个命令,现在总结一下: 1.git reset 如果想回退错误的提交C和D,只要把指针移到B上 git reset --hard a0fvf8 而这时候,远程仓库的指针还在D上 ...
- 2、Java并发性和多线程-多线程的优点
以下内容转自http://ifeve.com/benefits/: 尽管面临很多挑战,多线程有一些优点使得它一直被使用.这些优点是: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 资源利用 ...
- MongoDB小结02 - 配置、启动MongoDB
下载MongoDB 第一步:登上MongoDB官网,找到自己的适合的版本下载 第二步:解压(免安装),改名mongodb(举例命名,可以任个人喜好),放在你喜欢的位置(任喜好) 第三步:通过命令行: ...