最短路算法 堆优化 dijkstra+heap

原创 2013年12月05日 10:26:57

1. 用STL的优先队列

   

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N=405;
struct rec
{
    int v,w;
};
vector<rec> edge[N*N];
int n,st,ed;
__int64 dis[N*N];
bool vis[N*N];
struct cmp
{
    bool operator()(int a,int b)
    { 
        return dis[a]>dis[b];
    } 
};
void Dijkstra()
{
    priority_queue<int,vector<int>,cmp> Q;
    memset(dis,-1,sizeof(dis));
    memset(vis,0,sizeof(vis));
    int i,u,v;
    Q.push(st);
    dis[st]=0;
    while(!Q.empty())
    {
        u=Q.top();
        Q.pop();
        vis[u]=0;
        if(u==ed)
            break;
        for(i=0;i<edge[u].size();i++)
        {
            v=edge[u][i].v;
            if(dis[v]==-1 || dis[v]>dis[u]+edge[u][i].w)
            {
                dis[v]=dis[u]+edge[u][i].w;
                if(!vis[v])
                {
                    vis[v]=1;
                    Q.push(v);
                }
            }
        }
    }
}
2.手动写堆

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N=405;
struct rec
{
    int v,w;
};
vector<rec> edge[N*N];
int n,st,ed;
__int64 dis[N*N];
bool inHeap[N*N];
int heap[N*N];//存储节点id的堆
int inhp[N*N];//存储节点id在堆里面的位置
int size;//堆的大小
void upData(int x)
{
	while(x>1)
	{
        int px=x>>1;
		if(dis[heap[x]]<dis[heap[px]])
		{
			int temp;
                
            inhp[heap[x]]=px;
            inhp[heap[px]]=x;
                
            temp=heap[x];
            heap[x]=heap[px];
            heap[px]=temp;
                    
            x=px;
		}
        else
            break;
	}
}
void downData(int x)
{
	int lx,rx;
    while(x<=size/2)
	{
		lx=x<<1;
        rx=lx+1;
        int sx=x;
		if(lx<=size &&dis[heap[sx]]>dis[heap[lx]])
        {
            sx=lx;
		}
        if(rx<=size &&dis[heap[sx]]>dis[heap[rx]])
		{
            sx=rx;
		}
        if(sx==x)
            break;
		inhp[heap[x]]=sx;
        inhp[heap[sx]]=x;
            
        int temp=heap[x];
		heap[x]=heap[sx];
        heap[sx]=temp;
        x=sx;
	}
}
void Dijkstra()
{
	memset(dis,-1,sizeof(dis));
    memset(inHeap,0,sizeof(inHeap));
    size=1;
    heap[1]=st;
    inhp[st]=1;
    int i,u,v;
	dis[st]=0;
    while(size>0)
    {
		u=heap[1];
        if(u==ed)
        {
            break;
        }
        int temp;
        temp=heap[1];
        heap[1]=heap[size];
        heap[size]=temp;
		inhp[heap[1]]=1;
        size--;
        downData(1);
        inHeap[u]=false;
        for(i=0;i<edge[u].size();i++)
        {
            v=edge[u][i].v;
            if(dis[v]==-1 || dis[v]>dis[u]+edge[u][i].w)
            {
                dis[v]=dis[u]+edge[u][i].w;
                if(!inHeap[v])
                {
                    inHeap[v]=true;
                    size++;
                    heap[size]=v;
                    inhp[v]=size;
                    upData(size);
                }
                else
                {
                    upData(inhp[v]);
                }
            }
        }
    }
        
} 


dijkstra算法O(n²) 堆优化O(nlogn)

用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。 Dijkstra的时间复杂度是O (N2),它不能处理存在负边权的情况。 算法描述: ...

Dijkstra+堆优化

关于dijkstra,我们应该比较熟悉了,今天讲的是dijkstra的堆优化(O(ElogN))(如果连dijkstra都不知道的小朋友给你一个网址:http://www.cnblogs.com/do...

Dijkstra+堆优化 模板

#include #include #include #include #include #include using namespace std; const int maxn=30000+5;  ...

白书上的dijkstra+堆优化/dijkstra的一些性质

模板 #include #include #include #include #include #include using namespace std; const int m...
  • cyendra
  • cyendra
  • 2013年05月23日 14:23
  • 714

Heap+Dijkstra堆优化的Dijkstra

前面说到“原生的Dijkstra”,由于Dijkstra采用的是贪心策略,在贪心寻找当前距离源结点最短的结点时需要遍历所有的结点,这必然会导致效率的下降,时间复杂度为n^n。因此当数据量较大时会消耗较...

单源最短路 dijkstra + heap 实现

/** 再写一篇睡觉,正好把刚刚的优先队列用下。。 前面再说单源最短路径的时候用到dijkstra 算法,现在介绍下 它的优化版,传说中的 O(N*log(E)) ...
  • zcube
  • zcube
  • 2015年09月05日 10:10
  • 1170

单源最短路径(堆优化的Dijkstra算法)

Dijkstra算法:设初始节点为v,起始节点到其他节点u的距离为图中v到u的直接线路的距离,如果v和u之间没有直接线路,则d[u]=INF(无穷大)。初始化S={v},寻找最短路径(即在d[]中寻找...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

再谈Dijkstra算法和堆优化

用邻接矩阵的Dijkstra算法的代码: int mp[maxn][maxn]; int dis[maxn]; bool visit[maxn]; int n,m;   //V,E     void ...

堆优化的dijkstra算法(以邻接表存储)

堆优化的dijkstra 对于dijkstra为单源最短路的算法,其未优化版本为直接遍历每个点来寻找到源点最近的点,再以该点去更新与之相连的点,直到将每个点都利用更新其他点,这样便寻找到了从源点K出发...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最短路算法 堆优化 dijkstra+heap
举报原因:
原因补充:

(最多只允许输入30个字)