《算法导论》笔记 第24章 24.3 Dijkstra 算法

【笔记】


用二项堆实现优先队列O((V+E)lgV),所有顶点都从源点可达的话,O(ElgV)。

const int maxn=11111;  
const int maxm=1111111;  
  
struct EdgeNode{  
    int to;  
    int w;  
    int next;  
};  
  
struct HeapNode{  
    int d,u;  
    bool operator<(const HeapNode& rhs) const{  
        return d>rhs.d;  
    }  
};  
  
struct Dijkstra{  
    EdgeNode edges[maxm];  
    int head[maxn];  
    int edge,n;  
    void init(int n){  
        this->n=n;  
        memset(head,-1,sizeof(head));  
        edge=0;  
    }  
    void addedges(int u,int v,int c){  
        edges[edge].w=c,edges[edge].to=v,edges[edge].next=head[u],head[u]=edge++;  
    }  
    bool done[maxn];  
    int dis[maxn];  
    int pre[maxn];  
    void dijkstra(int s){  
        priority_queueque;  
        for (int i=0;idis[u]+w){  
                    dis[v]=dis[u]+w;  
                    pre[v]=u;  
                    que.push((HeapNode){dis[v],v});  
                }  
            }  
        }  
    }  
}solver;  



【练习】


24.3-1


24.3-2


24.3-3


24.3-4


24.3-5


24.3-6


24.3-7


24.3-8



你可能感兴趣的:(算法导论)