1223: 最短路(dijkstra算法)

在这里插入图片描述

输入
第一行两个正整数n,m用空格隔开(n≤100,m≤1000)代表n个顶点,m条边。
接下来m行每行三个整数u,v,w代表有一条权值为w的边从u到v,(1≤u,v≤n,1≤w≤100000)可能含有重边。
样例解释如上。

输出
一行n个数,含义如题目描述。

样例输入
6 10
1 2 3
3 4 2
2 4 7
1 3 4
1 4 3
1 5 10
2 5 4
5 6 5
5 3 2
2 6 1

样例输出
0 3 4 3 7 4

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<int,int> P;
const ll maxn=1e3+10;
const ll inf=0x3f3f3f;
int n,m;
struct edge{
	int to;
	int cost;
};
vector<edge> g[maxn];
int d[maxn];
void dij(int s){
	fill(d,d+n+100,inf);
	d[s]=0;
	priority_queue<P,vector<P>,greater<P> > que;
	que.push({d[s],s});
	while(!que.empty()){
		P pp=que.top();
		que.pop();
		int v=pp.second;
		//int w=pp.first;
		if(d[v]<pp.first)continue;
		for(int i=0;i<g[v].size();i++){
			edge e=g[v][i];
			if(d[e.to]>(d[v]+e.cost)){
				//cout<<u<<" "<<v<<endl;
				//cout<<u<<" "<<d[v]<<" "<<ww<<endl;
				d[e.to]=d[v]+e.cost;
				//cout<<d[v]<<" "<<ww<<" "<<u<<" "<<d[u]<<endl;
				que.push({d[e.to],e.to});
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=0;i<m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
	}
	dij(1);
	for(int i=1;i<=n;i++){
		printf("%d ",d[i]);
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是使用Dijkstra算法求解最短路径的MATLAB代码示例: ```matlab function [dist, path] = dijkstra(adjMatrix, startNode) numNodes = size(adjMatrix, 1); % 初始化距离组 dist = inf(1, numNodes); dist(startNode) = 0; % 初始化路径组 path = cell(1, numNodes); path{startNode} = startNode; % 创建一个标记组,用于记录节点是否已被访问 visited = false(1, numNodes); % 运Dijkstra算法 for i = 1:numNodes-1 % 找到当前距离最小的节点 [~, currentNode] = min(dist .* ~visited); visited(currentNode) = true; % 更新与当前节点相邻的节点的距离 neighbors = find(adjMatrix(currentNode, :)); for j = neighbors if ~visited(j) && dist(currentNode) + adjMatrix(currentNode, j) < dist(j) dist(j) = dist(currentNode) + adjMatrix(currentNode, j); path{j} = [path{currentNode}, j]; end end end end ``` 使用示例: ```matlab % 定义一个邻接矩阵表示图的连接关系 adjMatrix = [ 0 3 0 4 0; 3 0 5 0 0; 0 5 0 2 6; 4 0 2 0 1; 0 0 6 1 0 ]; % 调用Dijkstra算法求解最短路径 [startNode, endNode] = deal(1, 5); [dist, path] = dijkstra(adjMatrix, startNode); % 输出结果 disp(['从节点', num2str(startNode), '到节点', num2str(endNode), '的最短距离为:', num2str(dist(endNode))]); disp(['最短路径为:', num2str(path{endNode})]); ``` 这段代码实现了Dijkstra算法的逻辑,并且可以根据输入的邻接矩阵和起始节点,求解出最短路径的距离和路径。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值