free

传送门   来源: 牛客网

题目描述

Your are given an undirect connected graph.Every edge has a cost to pass.You should choose a path from S to T and you need to pay for all the edges in your path. However, you can choose at most k edges in the graph and change their costs to zero in the beginning. Please answer the minimal total cost you need to pay.

输入描述:

The first line contains five integers n,m,S,T,K.

For each of the following m lines, there are three integers a,b,l, meaning there is an edge that costs l between a and b.

n is the number of nodes and m is the number of edges.

输出描述:

An integer meaning the minimal total cost.

输入

3 2 1 3 1
1 2 1
2 3 2

输出

1

备注:

1≤n,m≤103,1≤S,T,a,b≤n,0≤k≤m,1≤l≤106.

Multiple edges and self loops are allowed.

题目描述:

给出n个点,和m条带权边,并且可以选定几条边令其权值为0,但选择的边数最多是k条,求s和t两点的最短距离。

思路:

有k次机会使边的权值为0,是分层最短路的经典问题。

具体方法看下图:(图中序号是从0开始的,下面讲解用从1开始的)

图源:sugarbliss

根据上图可以知道当k=2时,需要建k+1层的图,其中第一层序号是[1,n],往下依次是[1+n,n+n]、[1+2n+n+2*n]

在使用链式前向星存图的时候,要同时存下一列的权值,并将上下两层的权值设为0。

最终最短路的长度出现在每一行的最后,即:n、2*n、3*n。

例如(1,5)=10 要存(1+5,5+5)=10、(1+2*5,5+2*5)=1

(1,5+5+1)=0   等。

(看不懂直接看代码很好理解,找了一下午才找了个感觉好适应的板子)

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAX=5e6;
const int INF=0x3f3f3f3f;
LL n,m,s,t,k;
LL head[MAX+5],ans;
LL dis[MAX+5],vis[MAX+5];
struct note{
LL to;
LL len;
LL next;
}edge[MAX+5];
void addedge(LL u,LL v,LL w)
{
edge[ans].to=v;
edge[ans].len=w;
edge[ans].next=head[u];
head[u]=ans++;
}
void init()
{
memset(head,-1,sizeof(head));
ans=0;
}
struct node{
LL u,len;
node(LL a,LL b){
u=b;
len=a;
}
friend bool operator < (node a,node b){
return a.len>b.len;
}
};
priority_queue<node>q;
void diji(LL s)
{
for(LL i=0;i<=(k+1)*n;i++){
dis[i]=INF;
vis[i]=0;
}
dis[s]=0;
q.push(node(0,s));
while(!q.empty()){
int k=q.top().u;
q.pop();
if(vis[k]){
continue;
}
vis[k]=1;
for(LL i=head[k];~i;i=edge[i].next){
int t=edge[i].to;
if((dis[t]>dis[k]+edge[i].len&&edge[i].len!=INF+2)){
dis[t]=dis[k]+edge[i].len;
q.push(node(dis[t],t));
}
}
}
}
int main()
{
scanf("%lld%lld%lld%lld%lld", &n, &m, &s,&t,&k);
init();
while(m--)
{
LL u, v, w;
scanf("%lld%lld%lld",&u, &v, &w);
for(LL i = 0; i <= k; i++)
{
addedge(u + i * n, v + i * n, w);
addedge(v + i * n, u + i * n, w);
if(i != k)
{
addedge(u + i * n, v + (i + 1) * n, 0);
addedge(v + i * n, u + (i + 1) * n, 0);
}
}
}
diji(s);
LL ans = INF;
for(LL i = 0; i <= k; i++)
ans = min(ans,dis[t + i * n]);
printf("%lld\n",ans);
}

free【分层图最短路】的更多相关文章

  1. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

  2. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  3. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  4. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  5. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  6. BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

    BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...

  7. BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路

    BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...

  8. Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】

    <题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...

  9. ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】

    <题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...

  10. BZOJ2662[BeiJing wc2012]冻结——分层图最短路

    题目描述 “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”     在这个愿望被实现以后的世界里,人们享受着魔法卡片(Spe ...

随机推荐

  1. 201771010128王玉兰《面向对象程序设计(Java)》第八周学习总结

    第一部分:理论知识部分总结 (1)接口:接口不是类,而是对类胡一组需求描述,由常量肯一组抽象方法组成. a:接口中不包括变量和有具体实现的方法 b:只要类实现了接口,则该类要遵从接口描述的统 一格式进 ...

  2. 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行

    错误 Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率.其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再 ...

  3. [译] 制作 Vue 3 的过程

    原文链接: https://increment.com/frontend/making-vue-3 在过去的一年里,Vue 团队一直在研究 Vue.js 的下一个主要版本,我们希望在 2020 年上半 ...

  4. 【转】DataFrame合并

    参考:python 把几个DataFrame合并成一个DataFrame——merge,append,join,conca 横向合并(扩展列):merge,类似SQL的join,内连接,外连接等. 纵 ...

  5. nacos 配置

    具体请访问 https://nacos.io/zh-cn/docs/what-is-nacos.html 网站查看文档,现在开始使用Nacos. 1. 下载Nacos源码 Nacos可以通过 http ...

  6. & Google前沿的AMP技术

    首先要知道什么是AMP以至于为什么要选择AMP? AMP他并不是一门新技术,他只是一种能够让页面更快打开的一种办法.之所以用他是因为AMP能够带来SEO排名优化.另外Google搜索结果对AMP页面有 ...

  7. Rocket - debug - Example: Write Memory

    https://mp.weixin.qq.com/s/on1LugO9fTFJstMes3T2Xg 介绍riscv-debug的使用实例:使用三种方法写内存. 1. Using System Bus ...

  8. Rocket - tilelink - Atomics

    https://mp.weixin.qq.com/s/TSwKL_qm-b-0e8x7r--hhg   简单介绍Atomics中数学运算.逻辑运算的实现.   ​​   1. io   Atomics ...

  9. doReleaseShared源码分析及唤醒后继节点的过程分析

    文章结构 源码:对doReleaseShared()方法的源码进行一些注释 使用场景:介绍doReleaseShared()使用位置,及目的 以写锁开始的队列:分析写锁开始得同步等待队列在唤醒后续读锁 ...

  10. Java实现 LeetCode 741 摘樱桃(DFS || 递推 || 传纸条)

    741. 摘樱桃 一个N x N的网格(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示: 0 表示这个格子是空的,所以你可以穿过它. 1 表示这个格子里装着一个樱桃,你可以摘到樱桃然 ...