Dijkstra算法

迪杰斯拉特(Dijksta)算法用于在O(mlogn)时间内求出给定图的最短路,使用优先队列和邻接表来实现,通过当前最短路来对其他边进行松弛操作。

void addedge(int x,int y,double val)
{
 E[++Esize]=(Edge){y,val,last[x]},last[x]=Esize;
 E[++Esize]=(Edge){x,val,last[y]},last[y]=Esize;
}

void Dijkstra()
{
 Q.push(make_pair(0,s));

 rep(i,1,n) d[i]=INF;
 d[s]=0;

 while (!Q.empty())
 {
  int x=Q.top().second;Q.pop();

  if (vis[x]) continue; else vis[x]=1;
  
  for (int i=last[x];i;i=E[i].next)
  {
   int v=E[i].v;
   if (d[v]>(d[x]+E[i].val))
   {
    d[v]=d[x]+E[i].val;
    Q.push(make_pair(-d[v],v));
   }
  }
 }

 // rep(i,1,n) printf("d[%d] = %d\n",i,d[i]);
}

这里将边封装为一个数据结构(邻接矩阵确实方便,但内存也更大)。

posted @ 2016-02-23 20:41  Krew  阅读(204)  评论(0)    收藏  举报