Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】
<题目链接>
题目大意:
现在他们想从 1 号城镇最快的走到 n 号城镇(即出口),现在他们想让你告诉他们最短需要走多少路。
2≤n≤800,1≤m≤4000,1≤k≤10,1≤w≤10^6
解题分析:
本题很明显是一道分成图最短路的题。主要的就是怎么处理"穿过"K个点,我是通过在最短路松弛过程中,判断下一个点是否是封锁点,是的话,就要利用分层图的性质进行松弛。因为题目规定的是穿过k个封锁点,所以我们需要对起点和终点进行处理。如果起点是封锁点,那么k--,如果终点是封锁点k++,因为起点是一定要穿过的,而终点穿不过。
#include <bits/stdc++.h>
using namespace std; #define clr(a,b) memset(a,b,sizeof(a))
#define rep(i,s,t) for(int i=s;i<=t;i++)
typedef long long ll;
const int N = , M = ;
int n,m,k,cnt;
int isgo[N],head[N]; template<typename T>
inline void read(T&x){
x=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar(); }
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
x*=f;
}
struct Edge{
int to,nxt;ll w;
}edge[M<<]; struct Node{
int loc,lev;ll dist;
Node(int _loc=,int _lev=,ll _dist=):loc(_loc),lev(_lev),dist(_dist){}
bool operator < (const Node &tmp)const{ return dist>tmp.dist; }
}node[N][];
int vis[N][]; inline void init(){ cnt=;clr(head,-); }
inline void add(int u,int v,ll w){
edge[++cnt].to=v,edge[cnt].nxt=head[u];
edge[cnt].w=w;head[u]=cnt;
}
void Dij(){
rep(i,,n) rep(j,,k){
node[i][j].loc=i,node[i][j].lev=j;
node[i][j].dist=1e18;vis[i][j]=;
}
priority_queue<Node>q;
node[][].dist=;
q.push(node[][]);
while(!q.empty()){
Node now=q.top();q.pop();
int loc=now.loc,lev=now.lev;
if(vis[loc][lev])continue;
vis[loc][lev]=;
for(int i=head[loc];~i;i=edge[i].nxt){
int v=edge[i].to;ll cost=edge[i].w;
if(!isgo[v] && node[v][lev].dist>node[loc][lev].dist+cost){ //进行同层次建进行正常的松弛
node[v][lev].dist=node[loc][lev].dist+cost;
q.push(Node(v,lev,node[v][lev].dist));
}
if(isgo[v] && (lev+)<=k && node[v][lev+].dist>node[loc][lev].dist+cost){ //不是封锁点的就没有必要利用分层图进行松弛,因为在正常的一层就已经松弛了
node[v][lev+].dist=node[loc][lev].dist+cost;
q.push(Node(v,lev+,node[v][lev].dist));
}
}
}
}
int main(){
init();
read(n);read(m);read(k);
rep(i,,n) read(isgo[i]);
rep(i,,m){
int u,v;ll w;read(u);read(v);read(w);
add(u,v,w);add(v,u,w);
}
if(isgo[])k--;
if(isgo[n])k++;
Dij();
ll ans=1e18;rep(i,,k)ans=min(ans,node[n][i].dist);
printf("%lld\n",ans);
}
Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】的更多相关文章
- Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】
<题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...
- Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)
<题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...
- poj3635Full Tank?[分层图最短路]
Full Tank? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7248 Accepted: 2338 Descri ...
- HDU 5669 线段树优化建图+分层图最短路
用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...
- BZOJ 2763 分层图最短路
突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...
- 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)
[题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...
- 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
- BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路
BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...
- BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路
BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...
随机推荐
- 放一点百度来的,常见的windowserror
0操作成功完成.1功能错误.2系统找不到指定的文件.3系统找不到指定的路径.4系统无法打开文件.5拒绝访问.6句柄无效.7存储控制块被损坏.8存储空间不足,无法处理此命令.9存储控制块地址无效.10环 ...
- python并发编程之IO模型,
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
- 【深度学习】吴恩达网易公开课练习(class1 week2)
知识点汇总 作业内容:用logistic回归对猫进行分类 numpy知识点: 查看矩阵维度: x.shape 初始化0矩阵: np.zeros((dim1, dim2)) 去掉矩阵中大小是1的维度: ...
- Redis扩展
Redis扩展下载地址:https://windows.php.net/downloads/pecl/releases/redis/ PHP怎么安装redis扩展 http://www.php.cn/ ...
- laravel 里面结合关联查询 的when()用法
Laravel 5.6 里面的when用法: $name = $request->get('name'); //活动标题 $start_time = $request->get('star ...
- 在anaconda中安装tensorflow
打开Anaconda Prompt, step1: 输入清华仓库镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...
- django----Form提交按钮
form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响 <button class="login" ty ...
- JS:事件循环机制、调用栈以及任务队列
点击查看原文 写在前面 js里的事件循环机制十分有趣.从很多面试题也可以看出来,考察简单的setTimeout也就是考察这个机制的. 在之前,我只是简单地认为由于函数执行很快,setTimeout执行 ...
- Yslow web性能测试插件
YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. YSlow可以分析任何网站,并为每一个规则产生一个整体报告,如果页面可以进行优化,则YSlow会列出具体的修 ...
- jenkins权限管理,实现不同用户组显示对应视图views中不同的jobs
如何分组管理权限,如何实现不同用户组显示对应视图views中不同的jobs,建议使用Role Strategy Plugin插件. 1.安装Role Strategy Plugin插件. 2.“系统管 ...