当前位置: 首页 > news >正文

蓝桥王国(Dijkstra优先队列)

问题描述

小明是蓝桥王国的王子,今天是他登基之日。

在即将成为国王之前,老国王给他出了道题,他想要考验小明是否有能力管理国家。

题目的内容如下:

蓝桥王国一共有 N 个建筑和 M 条单向道路,每条道路都连接着两个建筑,每个建筑都有自己编号,分别为 1∼N 。(其中皇宫的编号为 1)

国王想让小明回答从皇宫到每个建筑的最短路径是多少,但紧张的小明此时已经无法思考,请你编写程序帮助小明回答国王的考核。

输入描述

输入第一行包含两个正整数 N,M。

第 2 到 M+1 行每行包含三个正整数 u,v,w,表示 u→v 之间存在一条距离为 w 的路。

1≤N≤3×10^5,1≤m≤10^6,1≤ui,vi≤N,0≤wi≤10^9。

输出描述

输出仅一行,共 N 个数,分别表示从皇宫到编号为 1∼N 建筑的最短距离,两两之间用空格隔开。(如果无法到达则输出 −1)

输入输出样例

示例 1

输入

3 3 
1 2 1
1 3 5
2 3 2

输出

0 1 3

题目链接:学习 - 蓝桥云课 

代码如下: 

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long LL;
typedef pair<LL,int> PII;//存储边的{路程,结点编号}信息 
vector<PII> adj[N];//adj[u]存储从节点u出发的所有信息,相当于一个二维数组 adj[i][j],从i出发有j条边的信息(即存储与第j个邻接点的信息),只不过每一个元素(边)是一个pair类型(含边的权重& i连接的节点编号)
LL dist[N];//记录源点到节点的最短路径
bool visited[N];//标记节点是否被访问过
int n,m;//节点数量,边的数量 

void dijkstra(int s)
{
	fill(dist,dist+N,LLONG_MAX);
	memset(visited,false,sizeof(visited));
	
	dist[s]=0;
	
	//定义一个优先队列 
	priority_queue<PII,vector<PII>,greater<PII> > pq; 
	
	
	//将s入队,其距离源点为0,加入优先队列,作为算法的起点 
	pq.push({0,s});
	
	while(!pq.empty())
	{
		//取出队头 
		auto t=pq.top();//优先队列队头是top
		//弹出
		pq.pop();
		
		//从取出的信息中取出节点信息
		//松弛点编号 
		int v=t.second;
		//松弛点与源点的最短距离
		//dist[v]=t.first;不可以用,会覆盖后面已经更新后的最短距离值 
		
		//如果该节点以确定最短距离(已被访问完毕)
		if(visited[v]==true)	continue;
		
		visited[v]=true;
		
		for(int j=0;j<adj[v].size();j++)
		{
			//取出当前节点信息
			//邻接点编号
			int u=adj[v][j].second;
			//与邻接点的权重(距离)
			LL weight=adj[v][j].first;
			
			if(dist[v]+weight<dist[u])
			{
				dist[u]=dist[v]+weight; 
				//将更新后的邻接点入队,以便后续继续处理 
				pq.push({dist[u],u}); 
			}
				
				
		} 
	}
}
int main()
{
	cin>>n>>m;
	
	//用邻接表存储图
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		
		//记录u-v边的信息
		adj[u].push_back({w,v}); 
	} 
	
	dijkstra(1);
	
	for(int i=1;i<=n;i++)
	{
		if(dist[i]==LLONG_MAX)
			cout<<-1<<" ";
		else
			cout<<dist[i]<<" ";
	}
		 
	return 0;
} 

 

相关文章:

  • 专业网站建设基本流程做网络销售如何找客户
  • 济南网站建设铭盛信息手机百度云网页版登录
  • WordPress页脚随机文章重庆seo优化公司
  • zencart 官方网站石家庄seo外包的公司
  • 在线做印章网站如何在百度上发表文章
  • 佛山网站建站建设上海百度公司地址
  • 实战 | 基于 SpringBoot + MyBatis-Plus + UniApp 构建无人棋牌室管理系统:架构解析与性能优化
  • 【AI工具】FastGPT:开启高效智能问答新征程
  • 每日一题(小白)暴力娱乐篇19
  • Unity遮挡剔除与视锥剔除混合策略技术详解
  • 遍历算法及其应用详解
  • 【MQTT】
  • RVOS-1.环境搭建与系统引导
  • 《当区块链穿上防弹衣:落盘加密技术全景拆解》
  • 如何在服务器里部署辅助域
  • 数据结构|排序算法(二)插入排序 希尔排序
  • 可执行程序是如何诞生的(一)——概览
  • opencv(C++)操作图像像素
  • 【NLP 面经 8】
  • pycharm连接autodl训练遇到绝对路径问题
  • 如何应对客户频繁变更需求
  • CMake使用
  • 李贵永任香港共工新闻社副社长
  • /sys/fs/cgroup/memory/memory.stat 关键指标说明
  • 山东大学离散数学第八章习题解析
  • 力扣hot100_回溯(2)_python版本