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]);
}
这里将边封装为一个数据结构(邻接矩阵确实方便,但内存也更大)。

浙公网安备 33010602011771号