bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路
2763: [JLOI2011]飞行路线
Time Limit: 10 Sec Memory Limit: 128 MB
Description
Input
Output
Sample Input
0 4
0 1 5
1 2 5
2 3 5
3 4 5
2 3 3
0 2 100
Sample Output
HINT
对于30%的数据,2<=n<=50,1<=m<=300,k=0;
对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;
对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.
Source
将图拆成 k+1 层,第 i 层代表已用了 i 次免费的情况,每层内正常建图,并对于每条线路的两点,从上一层向下一层建一条权值为零的单向边,表示该条线路选择免费,这样保证不可返回上一层,且最多只能走 k 次。
然后直接跑dijkstra
当然这种方法固然可以过,但当 k 值变大又卡内存时,我们就需要另一种建图方式 http://www.cnblogs.com/lkhll/p/6616146.html
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1200010
#define M 2400010
#define pa pair<int,int>
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 cnt,lj[N],fro[M],to[M],v[M];
inline void add(int a,int b,int c){fro[++cnt]=lj[a];to[cnt]=b;v[cnt]=c;lj[a]=cnt;}
int n,m,k,s,t,a,b,c;
int dis[N];
bool vs[N];
void dijkstra()
{
priority_queue<pa,vector<pa>,greater<pa> >q;
memset(dis,,sizeof(dis));
dis[s]=;
int u,et;
q.push(make_pair(,s));
while(!q.empty())
{
u=q.top().second;q.pop();
if(vs[u]) continue;
vs[u]=;
for(int i=lj[u];i;i=fro[i])
{
et=to[i];
if(dis[et]>dis[u]+v[i])
{
dis[et]=dis[u]+v[i];
q.push(make_pair(dis[et],et));
}
}
}
}
int ans=2e9+;
int main()
{
n=read();m=read();k=read();
s=read()+;t=read()+;
for(int i=;i<=m;i++)
{
a=read()+;b=read()+;c=read();
for(int j=;j<=k;j++)
{
add(a+j*n,b+j*n,c);
add(b+j*n,a+j*n,c);
if(j!=k)
{
add(a+j*n,b+(j+)*n,);
add(b+j*n,a+(j+)*n,);
}
}
}
dijkstra();
for(int i=;i<=k;i++) ans=min(ans,dis[t+i*n]);
printf("%d\n",ans);
return ;
}
bzoj 2763: [JLOI2011]飞行路线 -- 分层图最短路的更多相关文章
- bzoj 2763 [JLOI2011]飞行路线——分层图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 分层图两种方法的练习. 1.把图分成k+1层,本层去上面一层的边免费.但空间时间都不算 ...
- bzoj 2763: [JLOI2011]飞行路线 分层图
题目链接 n个点m条路, 每条路有权值, 给出起点和终点, 求一条路使得权值最小.可以使路过的路中, k条路的权值忽略. 其实就是多一维, 具体看代码 #include<bits/stdc++ ...
- Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1728 Solved: 649[Submit][Statu ...
- 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\)的有向边 如果是取最大最 ...
- [JLOI2011]飞行路线 分层图最短路
题目描述: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在nn个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一 ...
- P4568 [JLOI2011]飞行路线 分层图最短路
思路:裸的分层图最短路 提交:1次 题解: 如思路 代码: #include<cstdio> #include<iostream> #include<cstring> ...
- 【bzoj2763】[JLOI2011]飞行路线 分层图最短路
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- [JLOI2011]飞行路线 (分层图,最短路)
题目链接 Solution 建立 \(k+1\) 层图跑 \(Dijkstra\) 就好了. Code #include<bits/stdc++.h> #define ll long lo ...
随机推荐
- python之yagmail库笔记
1. yagmail是啥 yagmail是给正常人用的,封装的比较彻底的一个python邮件库,发送接收邮件只需要几行代码,炒鸡简单. 2. 安装 使用pip安装,炒鸡简单: pip install ...
- Verilog笔记.4.inout端口
inout是一个双向端口,实现为使用三态门,第三态为高阻态‘z’. 在实际电路中高阻态意味着响应的管脚悬空.断开. 当三态门的控制信号为真时,三态门选通,作输出端口使用:控制信号为假时,三态门是高阻态 ...
- java 1.8 新特性 stream
并发提升 java 中Stream类似于hadoop中的数据分析的思路,只不过hadoop大,用的是多台机算机的计算生态,而java stream使用的单台计算机中的多cpu分析一块数据的过程.通过 ...
- linux系统性能排查命令
[top] 命令可以动态查看当前系统的资源情况,以及占用资源的命令列表 用法: - ctrl + c / q : 停止此命令运行 - c : 展示完整的命令 - [top -bn1]:可以不动态的展示 ...
- 移动端touch滑屏事件
<script> var windowHeight = $(window).height(), $body = $("body");// console.log($(w ...
- mysql 数据库备份及恢复
1.备份 # 导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -–add-drop-table -uusername -ppassword da ...
- java基础10 单例模式之饿汉式和懒汉式单例
前言: 软件行业中有23中设计模式 单例模式 模版模式 装饰者模式 观察者模式 工厂模式 ........... 单例模式 1. 单例模式包括 1.1 饿汉式单例 1.2 ...
- xcode没有ios7的模拟器
xcode7 目前只支持 ios8盒和iOS9的模拟器如果是Yosemite系统,下载xcode7和xcode6.4,两个版本可以共存,然后再下载iOS7默契你如果是EI Caption系统,网上说E ...
- Gitlab部署及汉化操作
一.简介 GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. GitLab拥有与Github类似的功能 ...
- linux中$的各种含义
我们先写一个简单的脚本,执行以后再解释各个变量的意义 # touch variable # vi variable 脚本内容如下: #!/bin/sh echo "number: ...