您的位置:首页 > Web前端 > JavaScript

堆优化 Dijstra单源最短路径算法 2(邻接表)

2016-04-17 15:39 549 查看
#include"iostream"

#include"cstdio"

using namespace std;

int u[100];

int v[100];

int w[100];

int first[100];

int next[100];

int n,m;

int dis[100];

int heap[100];

int k;

int minpoint;

int inf=9999999;

void swap(int x,int y)

{
int t=heap[x];
heap[x]=heap[y];
heap[y]=t;

}

void siftdown(int i)

{
int t,flag=0;
while(flag==0&&i*2<=n)
{
if(dis[heap[i]]>dis[heap[i*2]])
{
t=i*2;
}
else
{
t=i;
}
if(i*2+1<=n)
{
if(dis[heap[t]]>dis[heap[i*2+1]])
{
t=i*2+1;
}
}
if(i!=t)
{
swap(i,t);
i=t;
}
else
{
flag=1;
}
}

}

int pop()

{
int t=heap[1];
heap[1]=heap
;
n--;
siftdown(1);
return t;

}

int main()

{
cin>>n>>m;
k=n;
for(int i=1;i<=n;i++)
{
first[i]=-1;
dis[i]=inf;
}
dis[1]=0;
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
next[i]=first[u[i]];
first[u[i]]=i;
if(u[i]==1)
{
dis[v[i]]=w[i];

}
for(int i=1;i<=n;i++)
{
heap[i]=i;
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
int z=pop();
for(int i=1;i<=k-1;i++)
{
minpoint=pop();
int t=first[minpoint];
while(t!=-1)
{
if(dis[v[t]]>dis[u[t]]+w[t])
{
dis[v[t]]=dis[u[t]]+w[t];
}
t=next[t];
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
}
for(int i=1;i<=k;i++)
{
printf("%d ",dis[i]);
}
return 0;
}

无需赘语,需要注意的要点和邻接矩阵的堆优化dijstra算法是一样的,我们都必须小心再松弛操作完了之后,对堆进行一次重新调整
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: