首页 > 其他分享 >最短路径问题(单源最短路问题-都正边)1.0

最短路径问题(单源最短路问题-都正边)1.0

时间:2024-04-02 22:30:02浏览次数:21  
标签:dist idx int 单源 st 正边 dijkstra heap 1.0

基本思路和代码来自y总!

朴素版dijkstra算法

适合与稠密图,用邻接矩阵来存图

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;

int n,m;//
int g[520][520];//存图边的值 
int dist[520];//存最短距离 
bool st[520];//是否已经遍历过最小的边 

int dijkstra(){
	memset(dist,0x3f,sizeof(dist));//思路:1.将所有的距离初始化为无穷大 
	dist[1]=0;//思路: 2.将节点1的距离初始化为0 
	
	for(int i=0;i<n;i++){//思路: 3.遍历所有的节点 
		int t=-1;
		for(int j=1;j<=n;j++)//思路: 4.找到所有未遍历过的点中距离最短的 
			if(!st[j] && (t==-1 || dist[t]>dist[j]))//判断是否为最短的 
				t=j;
		//if(t==n) break;		
		st[t]=true;//记录已经用过 
		
		for(int j=1;j<=n;j++)//思路: 5.用t去更新每个节点的最短距离 
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
	
	if(dist[n]==0x3f3f3f3f) return -1;
	else return dist[n];
}

int main(){
	cin>>n>>m;
	
	memset(g,0x3f,sizeof(g));
	
	while(m--){//输入图 
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=min(g[a][b],c);//多条边,每次只取最小的那条边 
	}
	
	int  t=dijkstra();
	cout<<t; 
}

堆优化版的dijkstra算法

适用于稀疏图,用邻接表来存图

#include<bits/stdc++.h>
#include<queue>

using namespace std;
const int N=100010;
typedef pair<int,int>PII; 
int n,m,idx;
int h[N],e[N],ne[N],w[N];
int dist[N];
bool st[N];

void add(int a,int b,int c){
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}

int dijstra(){
	memset(dist,0x3f,sizeof(dist));//照样初始化 
	dist[1]=0; 
	
	priority_queue<PII,vector<PII>,greater<PII>> heap;//创建堆 
	heap.push({0,1});//将第一个点推入 
	
	while(heap.size()){//不为空就进行 
		auto t=heap.top();//取出每次最小的边 
		heap.pop();
		
		int ver=t.second,distance=t.first;//记录他的距离和编号 
		if(st[ver]) continue;//如果重复用过就直接结束 
		st[ver]=true;
		 
		for(int i=h[ver];i!=-1;i=ne[i])//进行每条边的更新 
		{
			int j=e[i];
			if(dist[j]>distance+w[i])
			{
				dist[j]=distance+w[i];
				heap.push({dist[j],j});
			}
		}
	}
	
	if(dist[n]==0x3f3f3f3f) return -1;
	else return dist[n];
}

int main(){
	cin>>n>>m;
	memset(h,-1,sizeof(h));
	
	while(m--){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c); 
	}
	
	int  t=dijstra();
	cout<<t; 
}

标签:dist,idx,int,单源,st,正边,dijkstra,heap,1.0
From: https://blog.csdn.net/2302_80928106/article/details/137294446

相关文章

  • 查询语句,在Hive版本3.1.0中执行报错,在Hive版本3.1.2中执行成功
    第3条语句执行查询,在Hive版本3.1.0中执行报错:Error:Errorwhileprocessingstatement:FAILED:ExecutionError,returncode2fromorg.apache.hadoop.hive.ql.exec.mr.MapRedTask(state=08S01,code=2),在Hive版本3.1.2中执行成功。新建表CREATETABLEuser_test(cr......
  • 前端自动部署报错“http://registry.npm.taobao.org/****/download/array-tree-filter
    自动部署时报错我试过更改淘宝镜像为https://registry.npmmirror.com但都不生效报错如下图:代码中的配置文件如下如上配置在其他测试环境均正常,只在生产环境报错求大佬帮忙看看是什么原因呀......
  • Astah Professional 9.1.0 x64
    AstahProfessional9.1.0x6424May20230CommentsProgrammingAstah, Astahcrack, Astahcrackdownload, Astahdownload, Astahfree, Astahfreedownload, Astahfullcrack, Astahpatch 4.3/5-(2982votes)DownloadatMAXIMUM......
  • ubuntu编译与安装 OpenSSL-1.0.0
    apt-getpurgeopensslrm-rf/etc/ssl#删除配置文件编译与安装OpenSSLprefix是安装目录,openssldir是配置文件目录,另外建议安装两次,shared作用是生成动态连接库。(需要同时指定prefix与openssldir,否则可能会因为找不到文件而报错)wgetftp://ftp.openssl.org/source/op......
  • 【数据库】postgresql截取最后一个字符之前的所有字符,如V1.0.0.20230731110947中取V1.
    在PostgreSQL中,我们可以使用position函数和split_part函数来截取最后一个.之前的所有字符。这两个函数都非常有用,尤其是在处理文本数据时。position函数position函数用于查找一个字符串中某个子串的位置。它的语法如下:POSITION(substringINstring)其中,substring是要查找的......
  • Android 11.0 系统Settings横屏状态下wifi扫码不能识别功能修复
    1.前言在11.0的系统rom产品定制化开发过程中,在对于wifi扫描二维码的时候,可以看到相关的wifi信息,在竖屏的情况下不会有什么问题,但是如何在系统settings横屏的情况下扫描wifi的二维码的时候,发现识别不了,接下来就来分析下相关的wifi扫描相关流程,看如何实现相关功能2.系统Sett......
  • 说说 HTTP1.0/1.1/2.0 的区别?
     一、HTTP1.0HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本HTTP1.0 浏览器与服务器只保持短暂的连接,每次请求都需要与服务器建立一个TCP连接服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求简单来讲,每次与服务器交互,都需要新......
  • C语言中“ *1.0 ”的作用
    一个“错误的”例子:我们先来看一段简单的代码:下面这个“代码”是一个进行除法运算的代码假设我们进行“3/2”的运算,结果是1.5,但是这串代码最后的结果是1.0,这显然不是我们想要的结果。intmain(){inta,b;floatc;scanf("%d%d",&a,&b);c=a/b;p......
  • AI-Web-1.0靶场
    准备阶段下载地址Download:https://drive.google.com/open?id=140bO4W6v7fd_dWhCmcFHTf86zwL9s_xPDownload(Mirror):https://download.vulnhub.com/aiweb/AI-Web-1.0.7z网络设置将网络设置为桥接模式信息收集端口扫描nmap网络使用了NAT模式,先查看本机的VMware8(默......
  • PanTools v1.0.17 多网盘批量管理 批量分享、转存、复制...
    软件介绍一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等,支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等,对于管理名下具有多个网盘多个账号具有实用的效果。支持:百度......