侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【基础算法】图论——Dijkstra算法

Allen Best
2023-07-17 / 0 评论 / 1 点赞 / 90 阅读 / 703 字
温馨提示:
本文最后更新于 2023-07-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

image.png
image.png
image.png
image.png
image.png

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 101
using namespace std;
int w[N][N],dis[N],vis[N]; //w是边的权重 dis[]从起点到v点的最短路径
//vis代表是否访问过 
int n,m;//n是结点数,m是边数 
void Dijkstra(int x){//求从x到任一点的最短路径 
	memset(dis,INF,sizeof(dis));//dist[]=INF
	dis[x]=0;
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++){
		int j=0;
		for(int k=1;k<=n;k++){//找最小未被访问的dist[j]
			if(!vis[k]&&dis[k]<=dis[j]){
				j=k;
			}
		}
		vis[j]=1;
		for(int k=1;k<=n;k++){//更新dis[j]
			dis[k]=min(dis[k],dis[j]+w[j][k]);
		}
	}
}
int main(){
	int x,y,v,p;
	cin>>n>>m>>p;//p代表起点 
	memset(w,INF,sizeof(w)) ;
	while(m--){
		cin>>x>>y>>v;
		w[x][y]=w[y][x]=v;
	}
	//从结点p到n的最短路径 
	Dijkstra(p);
	for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
	return 0;
}


0

评论区