单源点最短距离(Dijkstra)

//2013/06/30<<数据结构与算法分析>>
#include<iostream>
#define INIT  300000//表示无穷
using namespace std;
void InitGraph(Graph &G,int * &distance,int *& visted,int n)//创建图中变量初始化
{
  int i;
  int j;
  G=new int *[n];
  for(i=0;i<n;++i)
	  G[i]=new int [n];
  for(i=0;i<n;++i)
	  for(j=0;j<n;++j)
		  G[i][j]=INIT;
  for(i=0;i<n;++i)
	  visted[i]=0;
  for(j=0;j<n;++j)
	  distance[j]=INIT;

}  
void CreateGraph(Graph &G,int n,int edge)//图的创建
{
   int i;
   int j;
   int k;
   int weight;
   cout<<"please enter the node and weight==>>"<<endl;
   for(k=0;k<edge;++k)
   {       
      cin>>i>>j>>weight;
	  G[i][j]=weight;
   }
}
int mixVertex(Graph &G,int * &distance,int *&visted,int n)//每次找源点到其他未访问的并且距离最小的点
{
	int i,v;
	for(i=0;i<n;++i)//每次都是从零开始找没有访问的
		if(!visted[i]){v=i;break;}
	for(i=i+1;i<n;++i)//
	{
		if((!visted[i])&& (distance[i]<distance[v]))//初始化距离的都是INIT
			v=i;
	}
  return v;
}
void disfuc(Graph &G,int* &distance,int * &visted,int n)//源点到图中各点的最短路径
{
   int i,v,w;
   for(i=0;i<n;++i)
   {
      v=mixVertex(G,distance,visted,n);
      visted[v]=1;
      for(w=0;w<n;++w)//更新作用
	{		   
           if(v==0)distance[w]=G[v][w];///针对当w=0的时候,必须做出更新
             if(distance[w]>distance[v]+G[v][w])
	   distance[w]=distance[v]+G[v][w];
	}
   }
}

int main()
{
	int n=5;
	int edge=7;
	int i;
         int * visted;
         int * distance;
	Graph G;
         visted=new int[n];
         distance=new int[n];
	InitGraph(G,distance,visted,n);
	CreateGraph(G,n,edge);
         disfuc(G,distance,visted,n);
	for(i=0;i<n;++i)
	   cout<<distance[i]<<endl;
}

时间复杂度0(edge^2).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,由于我是一个纯文本AI模型,无法直接绘制流程图。但我可以为您提供文字描述来解释这些算法的流程。 1. Dijkstra算法: - 初始化将起始节点的距离设置为0,其他节点的距离设置为无穷大。 - 创建一个优先队列(通常使用最小堆)来存储待处理的节点。 - 将起始节点加入队列中。 - 从队列中取出距离最小的节点,遍历它的邻居节点。 - 更新邻居节点的距离,如果新的距离比当前距离小,则更新距离并将该节点加入队列中。 - 重复以上步骤,直到队列为空或者所有节点都被遍历过。 - 最终得到起始节点到其他节点的最短距离。 2. SPFA算法(Shortest Path Faster Algorithm): - 初始化将起始节点的距离设置为0,其他节点的距离设置为无穷大。 - 创建一个队列来存储待处理的节点。 - 将起始节点加入队列中,并标记为已访问。 - 从队列中取出一个节点,遍历它的邻居节点。 - 若通过当前节点可以获得更短的路径,则更新邻居节点的距离,并将该节点加入队列中。 - 重复以上步骤,直到队列为空或者所有节点都被遍历过。 - 最终得到起始节点到其他节点的最短距离。 3. Bellman-Ford算法: - 初始化将起始节点的距离设置为0,其他节点的距离设置为无穷大。 - 重复以下步骤,直到没有边需要更新: - 遍历图中的所有边,对每条边进行松弛操作(即更新节点的距离)。 - 最后进行一次遍历,检查是否存在负权回路(即路径上的权值之和为负数),如果存在,则无法求解最短路径;否则,得到起始节点到其他节点的最短距离。 这些算法都是用于解决图的单源短距离问题,但它们在实现细节和效率上略有不同。希望以上描述对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值