迪杰斯特拉(用邻接矩阵适用于稠密图)

# include <iostream>
# include <numeric>
# include <algorithm>
# include <functional>
# include <list>
# include <map>
# include <set>
# include <stack>
# include <deque>
# include <queue>
# include <vector>
# include <ctime>
# include <cstdlib>
# include <cmath>
# include <string>
# include <cstring>
# include <iomanip>
# include <queue>

using namespace std;
int const maxn = 10;
int e[maxn][maxn], dis[10], book[10];

const int INF = 0x3f3f3f3f;	// 用inf存储一个我们认为的正无穷值

void init()
{
	for(int i = 0; i < maxn; i++)
	{
		for(int j = 0; j < maxn; j++)
		{
			if(i == j)
				e[i][j] = 0;
			else
				e[i][j] = INF;
		}
	}
}

int main(int argc, char *argv[])
{
	//初始化
	int n, m;
	scanf("%d%d", &n, &m);//读入n和m, n表示顶点个数, m表示边的条数
	init();
	//读入边
	for(int i = 1; i <= m; i++)
	{
		int x, y, t;
		scanf("%d %d %d", &x, &y, &t);
		e[x][y] = t;
	}
	//初始化book,dis数组
	memset(book, 0, sizeof(book));
	memset(dis, 0, sizeof(dis));
	//初始化dis数组, 1号顶点到各个顶点的路程
	for(int i = 1; i <= n; i++)
	{
		dis[i] = e[1][i];
	}
	
	//标志着1号顶点已经被用
	book[1] = 1;
	int temp;
	//迪杰斯特拉
	for(int i = 1; i <= n-1; i++)
	{
		int min = INF;
		for(int j = 1; j <= n; j++)
		{
			//判断这个点用没用过并且要这个距离小于最小值才更新数据
			if(book[j] == 0 && dis[j] < min)
			{
				//dis[j] ==  e[1][j]源点1到自己的最短路劲
				min = dis[j];
				temp = j;//维护一个temp记录最小值的下标
			}
		}
		book[temp] = 1;//标记着这个边已经用过
		//选择一个离源点s最近的顶点temp, d[temp]最小,如果存在一条从temp到k的边,然后根据这个边进行边的松弛,如果这条边加进去更小就加进去
		//dis[temp] + e[temp][k];
		//dis[temp]表示是从1到temp的距离
		for(int k = 1; k <= n; k++)
		{
			if(e[temp][k] < INF)
			{
				if(dis[k] > dis[temp] + e[temp][k])
				{
					dis[k] = dis[temp] + e[temp][k];
				}
			}
		}
	}
	//输出单源最短路劲1到各个顶点的最短距离
	for(int i = 1; i <= n; i++)
	{
		printf("%d ", dis[i]);
	}
	printf("\n");

	return 0;
}
/*
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

reuslt:0 1 8 4 13 17

猜你喜欢

转载自blog.csdn.net/i_o_fly/article/details/80412690