迪杰斯特拉

/*
在网图和非网图中,最短路劲的含义是不同的
-网图是俩顶点经过的边上权值之和最少的路劲
-非网图是俩顶点之间经过的边数最少的路劲
*/


# 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>


using namespace std;
int main(int argc, char  *argv[])
{
	int e[10][10], dis[10], book[10], n, m;
	const int maxn = 0x3f3f3f3f;
	//读入n和m, n表示顶点数, m表示边的条数。
	scanf("%d %d", &n, &m);


	//初始化
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(i == j)
			{
				e[i][j] = 0;
			}
			else
			{
				e[i][j] = maxn;
			}
		}
	}


	//读入边
	for(int i = 1; i <= m; i++)
	{
		int t1, t2, t3;
		cin >> t1 >> t2 >> t3;
		e[t1][t2] = t3;
	}
	//初始化dis数组, 这里是1号顶点到其余各个顶点的初始路程
	for(int i = 1; i <= n; i++)
	{
		dis[i] = e[1][i];
	}
	//book数组初始化
	memset(book, 0, sizeof(book));
	book[1] = 1;
	//迪杰斯特拉算法核心语句
	//大循环意思是执行n-1找最短距离
	for(int i = 1; i <= n - 1; i++)
	{
		//找到离1号顶点最近的顶点
		int min = maxn;
		int flag;
		for(int j = 1; j <= n; j++)
		{
			if(!book[j] && dis[j] < min)
			{
				//记录最小值和下标
				min = dis[j];
				flag = j;
			}
		}
		book[flag] = 1;
		//找到当前最短顶点的下标然后进行松弛。
		for(int v = 1; v <= n; v++)
		{
			if(e[flag][v] < maxn)
			{
				if(dis[v] > dis[flag] + e[flag][v])
				{
					dis[v] = dis[flag] + e[flag][v];
				}
			}
		}
	}


	for(int i = 1; i <= n; i++)
	{
		if(i == n)
		{
			cout << dis[i] << endl;
		}
		else
		{
			cout << dis[i] << " ";
		}
	}


	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


*/
-+

猜你喜欢

转载自blog.csdn.net/I_O_fly/article/details/80053989