单源最短路算法(P3371·4779)

单源最短路径

边表存图方法

加边

inline void add(int x,int y,int z)//cnt=0;
{
    cnt++;
    nxt[cnt]=head[x];
    head[x]=cnt;
    to[cnt]=y;
    edge[cnt]=z;
}

遍历

eg:遍历与fr相连的边

for(int i=head[fr];i;i=nxt[i])

重载运算符(用于建立小根堆)

struct node{
    int u,d;
    bool operator<(const node & rhs)const{
        return d>rhs.d;
    }
};

然后是最短路算法

DIJKSTRA(堆优化)

inline void Dijkstra(int s)
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=0x7fffffff;
    }
    priority_queue<node> Q;
    dis[s]=0;
    Q.push((node){s,0});
    while(!Q.empty())
    {
        node fr=Q.top();Q.pop();
        int u=fr.u;
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u];i;i=nxt[i])
        {
            int v=to[i],w=edge[i];
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
            }
            Q.push((node){v,dis[v]});
        }
    }
}

SPFA

inline void SPFA(int s)
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=0x7fffffff;
    }
    queue<int> Q;
    dis[s]=0;
    inq[s]=1;
    Q.push(s);
    while(!Q.empty())
    {
        int fr=Q.front();Q.pop();
        inq[fr]=0;
        for(int i=head[fr];i;i=nxt[i])
        {
            int v=to[i],w=edge[i];
            if(dis[v]>dis[fr]+w)
            {
                dis[v]=dis[fr]+w;
                if(!inq[v])Q.push(v),inq[v]=1;
            }
        }
    }
}
posted @ 2018-10-18 10:56  加固文明幻景  阅读(12)  评论(0编辑  收藏  举报  来源