问题 4149 --有向图的最短路径问题(程序填空)

4149: 有向图的最短路径问题(程序填空)★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 66  解决: 41
[提交][状态][命题人:]

题目描述

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩散,直到扩展到终点为止。

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int edgs;
	int points;
	int dis[20];
	int flag[20];
	int infinity=9999999;
	cin>>points>>edgs;
	int edg[20][20];
	for(int i=1;i<=points;i++)
	{
		for(int j=1;j<=points;j++)
		{
			if(i==j)
			{
				edg[i][j]=___(1)_____;
			}
			else
			{
				edg[i][j]=_____(2)____;
			}
		}
	}
	int point1,point2,quanzhi;
	for(int i=1;i<=edgs;i++)
	{
		cin>>point1>>point2>>quanzhi;
		edg[point1][point2]=_____(3)_____;
	}
	for(int i=1;i<=points;i++)
	{
		dis[i]=edg[1][i];
	}
	for(int i=1;i<=points;i++)
	{
		flag[i]=0;
	}
	flag[1]=1;
	int min,u;
	for(int i=1;i<=points-1;i++)
	{
		//源点到源点不用比较,因此总的次数少一次
		min=infinity;
		for(int j=1;j<points;j++) 
		{
			if(flag[j]==0&&dis[j]<min)
			{
				//核心思想:依次比较出离源点最近的点
				min=_____(4)______;
				u=j; 
			}
		}
		flag[u]=1;
		for(int v=1;v<=points;v++)
		{
			//找出离源点最近的点后更新dis里面的源点到各个点的值是否最小
			if(edg[u][v]<infinity) 
			{
				if(dis[v]>dis[u]+edg[u][v])
				{
					dis[v]=_____(5)______
				}
			}
		}
	}
	for(int i=1;i<=points;i++)
	{
		cout<<dis[i]<<" ";
	}
	cout<<endl;
    return 0;
}


输入

输出

样例输入
Copy
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
样例输出
Copy
0 1 8 4 13 17

提示

来源

[提交][状态]