堆优化 Dijstra单源最短路径算法 2(邻接表)
来源:互联网 发布:淘宝免费推广的方法 编辑:程序博客网 时间:2024/05/01 12:00
#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];
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;
#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];
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算法是一样的,我们都必须小心再松弛操作完了之后,对堆进行一次重新调整
0 0
- 堆优化 Dijstra单源最短路径算法 2(邻接表)
- dijstra邻接表+堆优化模板
- Dijstra 单源最短路径算法 堆优化-1(二维数组存储数据)
- poj 1511 邻接表+堆优化的dijstra
- 单源最短路径Dijstra算法
- Dijstra算法 单源最短路径算法
- 堆优化的dijkstra算法(以邻接表存储)
- Dijkstra算法--邻接表存储+堆优化
- 有向图中Dijstra最短路径算法的邻接表实现
- 单源最短路径算法之dijstra
- Dijstra邻接表法
- Dijstra算法实现求解单源最短路径问题
- 邻接表实现 单源最短路径SPFA算法
- 最短路dijstra 堆优化
- 单源最短路径(堆优化的Dijkstra算法)
- 单源最短路径 DIJ算法(无堆优化)
- 最短路径--Dijstra算法
- Dijstra算法---普通版、优先队列优化版、堆优化版
- 【EJB系列】(四)——EJB基本内容总结
- 常用正则表达式
- this指针(待完善)
- Android View框架的layout机制
- 什么是软件需求?什么是功能需求?
- 堆优化 Dijstra单源最短路径算法 2(邻接表)
- 什么是软件设计模式?
- 第八周项目一(3) 数组作数据成员(多文件)
- 如何去调用res中的资源
- ffmpeg应用基础-2
- 【OpenStack】OpenStack原理(一)——OpenStack发展及架构
- 第五周项目一(2)-三角形类雏形
- swift2.0 异步post请求
- 初试Visual Studio Code配置Python开发环境