DIJKSTRA算法(优先队列实现)(o(n*n))

DISJKSTRA是求最短路经的经典算法,这是求源点到其它所有顶点的距离,所有的边必须为正 。算法原理:集合Q(除源点),初始状态有所有的顶点。集合S,初始状态只有源点,初始状态将所有的点push入去最小优先(权优先)队列,循环取出点放进S(直到所有的点都放进S),然后每次对取出的点进行relaxation  (松驰操作)。

#include<iostream>

#include<vector>

#include<queue>

using namespace std;

typedef pair<int,int> pii;

int  INF=100000000 ;

int a[100][100];

bool done[100];

int main()

{

      

       priority_queue<pii,vector<pii>,greater<pii> > dijk;

       int n,i,j,from,to,vertex,edge,x;

       while(scanf("%d",&n)!=EOF)

       {

              for(i=0;i<n;i++)

                     for(j=0;j<n;j++)

                     {

                            if(i==j)

                                   a[i][j]=0;

                            else

                                   a[i][j]=INF;

                     }

                     memset(done,true,sizeof(INF));

                    

                     for(i=0;i<n;i++)

                            for(j=0;j<n;j++)

                            {

                                   scanf("%d",&from);

                                   scanf("%d",&to);

                                   scanf("%d",&a[from][to]);

                            }

                            for(i=1;i<n;i++)

                            {

                                   dijk.push(make_pair(a[0][i],i));

                            }

                            while(!dijk.empty())

                            {

                                   pii u=dijk.top();

                                   dijk.pop();

                                   x=u.second;

                                   if(done[x]!=true)

                                          continue;

                                   done[x]=false;

                                   for(i=0;i<n;i++)

                                   {

                                          if(a[0][x]+a[x][i]<a[0][i])

                                          {

                                                 a[0][x]=a[0][x]+a[x][i];

                                                 dijk.push(make_pair(a[0][x],x));

                                          }//relaxation 

                                         

                                   }

                            }

                           

                           

                           

      

}

return 0;

}

或者按照《算法导法》的RELAXATION的操作:(CODE如下:)

#include<iostream>

#include<vector>

#include<queue>

using namespace std;

typedef pair<int,int> pii;

int  INF=100000000 ;

int a[100][100];

bool done[100];

int d[100];
int father[100];
int main()

{
 
 
 
 priority_queue<pii,vector<pii>,greater<pii> > dijk;
 
 int n,i,j,from,to,vertex,edge,x,temp,nn;
 
 while(scanf("%d",&n)!=EOF)
  
 {
  
  for(i=0;i<n;i++)
   
   for(j=0;j<n;j++)
    
   {
    
    if(i==j)
     
     a[i][j]=0;
    
    else
     
     a[i][j]=INF;
    
   }
   
   memset(done,true,sizeof(INF));
   
   
   scanf("%d",&nn);
   //for(i=0;i<n;i++)
    
    for(j=0;j<nn;j++)
     
    {
     
     scanf("%d",&from);
     
     scanf("%d",&to);
  
     
     scanf("%d",&a[from][to]);
     
    }
    for(i=0;i<n;i++)
    {
     father[i]=-1;
    }
    for(i=0;i<n;i++)
    {
     if(i==0)
      d[i]=0;
     else
      d[i]=INF;
    }
    
    
    for(i=0;i<n;i++)
     
    {
     
     dijk.push(make_pair(d[i],i));
     
    }
    
    while(!dijk.empty())
     
    {
     
     pii u=dijk.top();
     
     
     dijk.pop();
     
     x=u.second;
     
     if(done[x]!=true)
      
      continue;
     
     done[x]=false;
     
     for(i=0;i<n;i++)
      
     {
      
      if(d[x]+a[x][i]<d[i])
       
      {
       
       d[i]=d[x]+a[x][i];
       father[i]=x;
       
       dijk.push(make_pair(d[i],x));
       
      }//relaxation 
      
      
      
     }
     
    }
    temp=n;
    for(i=n;i>=0;i--)
    {
     cout<<"father:"<<father[temp]<<endl;;
     temp=father[temp];
    }//跟综最短路径
    
    
    
    for(i=0;i<n;i++)
    {
     cout<<"d["<<i<<"]"<<d[i]<<"   ";
    }
    
    
    
 }
 return 0;
}

你可能感兴趣的:(DIJKSTRA算法(优先队列实现)(o(n*n)))