Dijkstra-------------领接矩阵法实现

这是一个单源最短路线算法:寻找所有结点离起点的最短路线距离问题
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1000;
const int INF = 10000000;
int n, m, s, G[MAXN][MAXN];//n是顶点个数,m是边数,s是起点的编号,G数组是储存两个顶点之间的边权
int d[MAXN];//存放每个节点到起点的最短距离
bool vis[MAXN] = { false };//表示这个点是否已经走过了
void Dijstra1(int s)
{
	fill(d, d + MAXN, INF);
	d[s] = 0;
	for (int i = 0; i < n; i++)
	{
		int u = -1, MIN = INF;
		for (int j = 0; j < n; j++)//这个循环用来寻找还没有走到过的结点中距离原点最小的点
		{
			if (vis[j] == false && d[j] < MIN)//如果这个点没走过并且是最短值
			{
				u = j;
				MIN = d[j];
			}
		}
		if (u == -1)
			return;
		vis[u] = true;
		for (int v = 0; v < n; v++)//循环所有从上面找出来的结点u可以走到的所有结点
		{
			if (vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v])//如果这个结点还没有走过而且可以从u结点走到,并且可以进行优化
			{
				d[v] = d[u] + G[u][v];//优化d[v],更新这个最小值
			}
		}
	}
}
int main()
{
	int u, v, w;
	cin >> n >> m >> s;//顶点个数,边数,起点编号
	fill(G[0], G[0] + MAXN * MAXN, INF);
	for (int i = 0; i < m; i++)
	{
		cin >> u >> v >> w;//输入相通的两个定点u和v之间的边权
		G[u][v] = w;
	}
	Dijstra1(s);
	for (int i = 0; i < n; i++)
	{
		cout << d[i] << " ";
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/scwmason/article/details/80941101