首页 > 其他 > 详细

dijkstra算法

时间:2014-03-22 15:03:00      阅读:477      评论:0      收藏:0      [点我收藏+]

1.dijksta算法是贪婪算法的一个例子,贪婪算法分阶段地求解一个问题,每个阶段把当前的解作为最优解。dijkstra的算法思想与广度优先搜索类似,dijkstra算法可以解决非负权值有向图的单源最短路径问题,算法的结果是得到一颗最短路径树。

2.dijkstra算法的基本思想是:(1)初始时,集合S仅仅包含源点s,d[s]=0,如果其它顶点ws邻接,d[w]的值为权值,其它顶点若不和s邻接,则距离设置为无穷大(2)从邻接顶点选取与s最近的顶点ww加入集合S3)以w为中心,更新源点v到各节点的距离,即如果d[w]+d[w,v]<d[v],则用d[w]+d[w,v]更新sv的距离。(4)重复(2)(3),直到集合S中包含所有的顶点

3.dijkstra算法复杂度

使用邻接矩阵或者邻接表表示的图,dijkstra算法的复杂度为O(n^2)

4.dijkstra算法的程序为

# include <iostream>
using namespace std;
# include <stdlib.h>
# define NUM 10
# define ARG 10
# define INF 10000
int visited[NUM];
int dist[NUM];
int path[NUM];
struct graph{
	int num;
	int arc;
	int a[NUM][NUM];
	char name[NUM];
};
int main()
{   
	int i;
	void create(graph &g);
	void print(graph &g);
	void dijkstra(graph &g,int i);
	graph g;
	create(g);
	dijkstra(g,0);
	for(i=0;i<g.num;i++)
	{
	cout<<dist[i]<<endl;
	}
	system("pause");
return 0;
}
int locate(graph &g,char a)
{
int i=0;
for(i=0;i<g.num;i++)
	if (g.name[i]==a)
		return i;
return -1;
}

void create(graph &g)    //用邻接矩阵创建图
{
int i,j;
cout<<"input num of nodes and num of edges"<<endl;
cin>>g.num>>g.arc;
for(i=0;i<g.num;i++)
cin>>g.name[i];
for(i=0;i<NUM;i++)
	for(j=0;j<NUM;j++)
		g.a[i][j]=-1;
for(i=0;i<g.arc;i++)
{
	char a,b;
	int i,j,w;
cout<<"input name of nodes"<<endl;
cin>>a>>b>>w;
i=locate(g,a);
j=locate(g,b);
g.a[i][j]=w;
g.a[j][i]=w;
}
}

void dijkstra(graph &g,int i)    //dijkstra算法的程序  
{
int j;
int min;
int t;
for(j=0;j<g.num;j++)   //距离、前驱初始化
{
visited[j]=0;
if(g.a[i][j]>0)
{
dist[j]=g.a[i][j];
path[j]=i;
}
else
{
dist[j]=INF;
path[j]=-1;
}
}
path[i]=i;
dist[i]=i;
for(i=1;i<g.num;i++){   
min=INF;
for(j=0;j<g.num;j++)    //每次选取距离最小的结点
if(!visited[j]&&dist[j]<min)
{
min=dist[j];
t=j;
}

visited[t]=1;           //距离最小的点标记为已访问
for(i=0;i<g.num;i++)
if(!visited[i]&&min+g.a[t][i]<dist[i])
{
dist[i]=min+g.a[t][i];   //更新距离和前驱
path[i]=t;
}
}
}


dijkstra算法,布布扣,bubuko.com

dijkstra算法

原文:http://blog.csdn.net/u011608357/article/details/21784447

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!