单源点最短距离(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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值