单源点最短距离(Dijkstra)

来源:互联网 发布:淘宝店先做虚拟转实物 编辑:程序博客网 时间:2024/05/15 03:41
//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]))//初始化距离的都是INITv=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).