ACM-ICPC 2018 南京赛区网络预赛__L. Magical Girl Haze 【Dijkstra算法+分层图思想】

本文主要是介绍ACM-ICPC 2018 南京赛区网络预赛__L. Magical Girl Haze 【Dijkstra算法+分层图思想】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  •  1000ms
  •  262144K

There are N cities in the country, and M directional roads from u to v(1≤u,v≤n). Every road has a distance ci​. Haze is a Magical Girl that lives in City 1, she can choose no more than K roads and make their distances become 0. Now she wants to go to City N, please help her calculate the minimum distance.

Input

The first line has one integer T(1≤T≤5), then following T cases.

For each test case, the first line has three integers N,M and K.

Then the following M lines each line has three integers, describe a road, Ui​,Vi​,Ci​. There might be multiple edges between u and v.

It is guaranteed that N≤100000,M≤200000,K≤10,
0 ≤Ci​≤1e9. There is at least one path between City 1 and City N.

Output

For each test case, print the minimum distance.

样例输入

1
5 6 1
1 2 2
1 3 4
2 4 3
3 4 1
3 5 6
4 5 2

样例输出

3

题目来源

ACM-ICPC 2018 南京赛区网络预赛

题目大意:有N个城市,M条有向边,城市之间可能有多条边,你可以选择让至多K条边的长度变为0,问最好的情况下,城市1到城市N的最短路径为多少

题解:Dijkstra算法+分层图思想,具体看代码来理解分层图思想

AC的C++代码:

#include<iostream>
#include<vector>
#include<queue>
#include<cstring> using namespace std;typedef long long ll;const int INF=0x3f3f3f3f;
const int N=100003;struct Edge{//边 int v,w;//起点到终点v的花费为w Edge(int v,int w):v(v),w(w){} 
};struct Node{int u;int w;Node(){}Node(int u,int w):u(u),w(w){}bool operator<(const Node &a)const//使用优先队列,故将<重载为大于含义 {return w>a.w;}
};vector<Edge>g[N];
ll dist[N][11];//dist[i][j]表示在使得j条边为0的情况下源点到结点i的最短路 
bool vis[N][11];void dijkstra(int s,int n,int k)//源点为s,共有n个结点 可以选择k条边为0 
{priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(dist,INF,sizeof(dist));dist[s][0]=0;q.push(Node(s,0));while(!q.empty()){Node e=q.top();q.pop();int z=e.u/(n+1);//z表示使z条边的长度为0 int u=e.u%(n+1);//u表示当前结点编号 if(!vis[u][z]){//如果还未用dist[u][z]更新其他状态就进行更新 vis[u][z]=true;int num=g[u].size();//与u相连的点有num个 for(int i=0;i<num;i++){int v=g[u][i].v;//v为与u相连的点if(vis[v][z])//如果dist[u][z]已经得到了就跳过 continue;int c=g[u][i].w;//c表示结点u到结点v的距离 //选择1:不让这条边为0if(dist[v][z]>dist[u][z]+c){ dist[v][z]=dist[u][z]+c;/*第一个参数 z*(n+1)+v是为了使得z可以通过e.u/(n+1)得到,u可以 通过e.u%(n+1)得到 */ q.push(Node(z*(n+1)+v,dist[v][z]));}if(z==k)//如果已经使k条边为0,就跳过 continue;//选择2:让这条边为0,则dist[v][z]变为dist[v][z+1]因为多让一条边变为0 if(dist[v][z+1]>dist[u][z]){ dist[v][z+1]=dist[u][z];q.push(Node((z+1)*(n+1)+v,dist[v][z+1]));}}}}
}int main()
{int t,n,m,a,b,k,c;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);for(int i=0;i<=n;i++)g[i].clear();while(m--){scanf("%d%d%d",&a,&b,&c);g[a].push_back(Edge(b,c));}dijkstra(1,n,k);printf("%lld\n",dist[n][k]);}return 0;
} 

 

这篇关于ACM-ICPC 2018 南京赛区网络预赛__L. Magical Girl Haze 【Dijkstra算法+分层图思想】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626499

相关文章

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子