Dijkstra最简代码实现(无需结构体)

Posted 荣荣荣荣荣荣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra最简代码实现(无需结构体)相关的知识,希望对你有一定的参考价值。

在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。

在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。

接下来看程序:

输入格式

输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。
以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。

输出格式

只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。
请注意行尾输出换行。

样例输入

4 1
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

样例输出

6 4 7 

 

代码:

#include <bits/stdc++.h>

#define x first
#define y second
using namespace std;

typedef pair<int, int> PII ;
const int N = 100010, M = 2 * N, INF = 0x3f3f3f3f;
int n, m;
int h[N], w[M], e[M], ne[M], idx = 0;
int st[N];
int dist[N];
vector<int> delay[N];
void add(int a, int b, int c) 
	e[idx] = b;
	w[idx] = c;
	ne[idx] = h[a];
	h[a] = idx++;

void dijkstra() 
	priority_queue<PII, vector<PII>, greater<PII>> heap;
	heap.push(0, m + 1);
	memset(st, 0, sizeof st);
	memset(dist, INF, sizeof dist);
	while(heap.size()) 
		PII t = heap.top();
		heap.pop();

		int ver = t.y;
		if(st[ver]) continue;
		st[ver] = 1;

		for(int i = h[ver]; i != -1; i = ne[i]) 
			int distance = t.x + w[i];
			int j = e[i];
			if(distance < dist[j]) 
				dist[j] = distance;
				heap.push(dist[j], j);
			
		
	


int main() 
	memset(h, -1, sizeof h);
	cin >> n >> m;
	for(int i = 1; i <= n; i++) 
		for(int j = 1; j <= n; j++)
			int x;
			cin >> x;
			if(!x) continue;
			add(i, j, x);
		
	
	dijkstra();
	for(int i = 1; i <= n; i++)
		if(i == m + 1) continue;
		if(dist[i] == INF) cout << -1 << endl;
		else	cout << dist[i] << " "; 
	
	return 0;

  


  

以上是关于Dijkstra最简代码实现(无需结构体)的主要内容,如果未能解决你的问题,请参考以下文章

最快排序和搜索算法的最简代码实现_转

http://chimee.org/ 最简代码?

Python工程师Java之路(v)Socket极简代码

Python工程师Java之路(v)Socket极简代码

最短路径Dijkstra算法的分析与具体实现(思路加代码)

Python入门30个Python常用极简代码,现拿现用