dijkstra算法

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;
}
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值