堆优化dijstra(前向星存图)

堆优化dijstra(前向星存图)

o(* ̄▽ ̄*)o

上一次学会了spfa安利spfa,激动的不得了,然而

emmmmmm

遇见了这样的题。洛谷4779最短路标准版!连模板都无法AC使我十分不爽。

所以我决定学习堆优化dijstra。

手写堆对于我而言是不存在的。所以~STL万岁

依旧是迪杰斯特拉算法的思想,寻找当前距离最小的点,然后将它标记为已经确定的点,用它来更新各个没被确定的点。

emmmm我们选择优先队列来确定每一个最小距离的点

普通的优先队列是大根堆,所以我们选择用priority_queue<xx,vector<xx>,greater<xx> >q;这样就变成了小根堆~

为了方便操作,我们用pair来存队列~(优先队列会优先比较第一项,不需要重载

pair中的第一项保存起点到该点的距离,第二项记录该点是哪一个点。
​当当当当看代码~~~~~~~!

这个模板的题目就是上边的洛谷4779

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>//优先队列在这个库里
using namespace std;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;//定义一个小根堆(优先队列
int n,m,num,s;
int he[100010],d[100010],inq[100010];

//d数组表示点i和起点之间的距离,inq记录点i是否已确定,he是前向星存边~

void read(int &x)
{
    int f=1;x=0;char s=getchar();
    while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
    x=f*x;
}//快读(有的时候可以神奇的卡入一些神奇的TLE嘿嘿嘿
struct node
{
    int nxt;
    int to;
    int dis;
}edg[200020];//前向星!
void add(int a,int b,int c)
{
    edg[++num].to=b;
    edg[num].dis=c;
    edg[num].nxt=he[a];
    he[a]=num;
}//存边!
void dst(int s)
{
    memset(d,0x3f3f3f3f,sizeof(d));//初始化
    memset(inq,0,sizeof(inq));
    q.push(make_pair(0,s));//起点入队(堆)了
    d[s]=0;//自己到自己,距离0
    while(!q.empty())//队(堆)不是空的,此时距离起点最小的 点在队首(堆顶)
    {
        int x=q.top().second;//x:找到了!就是这个点!
        q.pop();//出队(堆),去履行更新其他点的光荣义务
        if(inq[x])continue;//如果这是一个已经确定过的点 ,拜拜
        inq[x]=1;
        int t=he[x];
        while(t)//遍历一遍这个点连向的点,更新最短路
        {
            if(d[edg[t].to]>d[x]+edg[t].dis&&!inq[edg[t].to])
            {
                d[edg[t].to]=d[x]+edg[t].dis;
                q.push(make_pair(d[edg[t].to],edg[t].to));//被更新了,进去
            }
            t=edg[t].nxt;
        }
    }    
}//嗷~
int main()
{
    int xx,yy,ww;
    read(n);read(m);read(s);
    for(int i=1;i<=m;i++)
    {
        read(xx);read(yy);read(ww);
        add(xx,yy,ww);//有向图
    }
    dst(s);
    for(int i=1;i<=n;i++)
    cout<<d[i]<<" ";
}

猜你喜欢

转载自blog.csdn.net/weixin_42759798/article/details/81538967