Dijkstra && STL堆+Dijkstra 模版

朴素Dijkstra : O(V^2)

void Dijkstra(int s,int n)            // s为起点 s-t是所有点的集合
{
    for (int i=0;i<n;i++)
        dist[i]=INT_MAX;        //limits.h
    memset(vis,0,sizeof(vis));      //string.h

    dist[s]=0;
    int ok=1;
    while(ok)
    {
        ok=0;
        int min=INT_MAX;
        int k;
        for (int i=0;i<n;i++)
            if ((!vis[i])&&(dist[i]<min))
            {
                min=dist[i];
                k=i;
                ok=1;
            }
        vis[k]=1;
        for (int i=0;i<n;i++)
            if (!vis[i])
            {
                if (dist[i]>dist[k]+d[k][i])
                {
                    dist[i]=dist[k]+d[k][i];
                }
            }


    }
}

 

STL堆+Dijkstra: O(ElogV)

priority_queue <pair<int ,int>,vector<pair<int ,int> >,greater<pair<int,int> > > PQ;

void Dijkstra(int s,int n)
{
    for (int i=0;i<n;i++)
        dist[i]=INT_MAX;        //limits.h
    memset(vis,0,sizeof(vis));      //string.h
    
    dist[s]=0;
    while(!PQ.empty())
        PQ.pop();
    PQ.push(make_pair(dist[s],s));
    while(!PQ.empty())
    {
        int k=PQ.top().second;
        PQ.pop();
        if (!vis[k])
        {
            vis[k]=1;
            for (int i=0;i<n;i++)
                if (!vis[i])
                {
                    if (dist[i]>dist[k]+d[i][k])
                    {
                        dist[i]=dist[k]+d[i][k];
                        PQ.push(make_pair(dist[i],i));
                    }
                }
        }
    }
}
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
原文地址:https://www.cnblogs.com/AbandonZHANG/p/2603958.html