Dijkstra(迪杰斯特拉) —— 单源最短路

在图中,我们可以指定一个点为起点,计算它到其余各点的最短路径。我们寻找一个与它之间最近的点,以此为基础不断的更新它经过此点到其他点的最短路,并重复这个过程,直到所有的点都被寻找一遍。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int MAXN = 100;
const int INF = 0x3f3f3f3f;

int MAP[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int n, m;

void Dijkstra()
{
	for(int cas = 1; cas < n; cas++)
	{
		int MIN = INF;
		int k;
		for(int i = 1; i <= n; i++)
		{
			if(vis[i] == false && dis[i] < MIN)
			{
				k = i;
				MIN = dis[i];
			}
		}
		vis[k] = true;

		for(int i = 1; i <= n; i++)
		{
			if(dis[k] + MAP[k][i] < dis[i])
				dis[i] = dis[k] + MAP[k][i];
		}
	}
	return ;
}

int main()
{
	while(~scanf("%d%d", &n, &m))
	{
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
				if(i == j) MAP[i][j] = 0;
				else MAP[i][j] = INF;

		int a, b, c;
		for(int i = 1; i <= m; i++)
		{
			scanf("%d%d%d", &a, &b, &c);
			MAP[a][b] = MAP[b][a] = c;
		}

		for(int i = 1; i <= n; i++)
			dis[i] = MAP[1][i];
		memset(vis, false, sizeof(vis));
		vis[1] = true;

		for(int i = 1; i <= n; i++)
			printf("%d ", dis[i]);
		printf("\n");
	}
	return 0;
}

可以根据需要适当修改细节大笑


注意  : Dijkstra无法处理负权边,接下来要用Bellman-Ford!!!!!!

猜你喜欢

转载自blog.csdn.net/someone_and_anyone/article/details/80960920
今日推荐