堆优化 Dijkstra......
  • 板块学术版
  • 楼主E1_de5truct0r
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/4/24 21:51
  • 上次更新2023/11/5 00:09:25
查看原帖
堆优化 Dijkstra......
195198
E1_de5truct0r楼主2021/4/24 21:51

RT,蒟蒻的堆优化 Dijkstra SPFA了,求助 QAQ

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
inline int getint()
{
    char ch=getchar();long long w=0,f=1;
    while(ch<'0' || ch>'9'){if(ch=='-')f=-f; ch=getchar();}
    while(ch>='0' && ch<='9'){w=(w<<1)+(w<<3)+(ch^48); ch=getchar();}
    return w*f;
}

int n,m,tot,start;
const int MAXN=500005;
struct Edge
{
    int u,w,head,nxt;
}a[MAXN];
bool vis[MAXN];
struct Point
{
    int dis,number;
    bool operator < (const Point &a)const
    {
        return dis>a.dis;
    }
}p[MAXN];
priority_queue<Point> q;

void add(int x,int y,int v)
{
    tot++;
    a[tot].u=y;
    a[tot].w=v;
    a[tot].nxt=a[x].head;
    a[x].head=tot;
}
inline void Dijkstra(int start)
{
    for(register int i=1;i<=n;i++) p[i].number=i;
    for(register int i=1;i<=n;i++)
    {
        Point minn=q.top();q.pop();
        int mini=minn.number;
        for(register int j=a[mini].head;j;j=a[j].nxt)
        {
            p[a[j].u].dis=min(p[a[j].u].dis,p[mini].dis+a[j].w);
            q.push(p[a[j].u]);
        }
    }
    p[start].dis=0;
    for(int i=1;i<=n;i++)
    {
        if(p[i].dis!=1000000000) cout<<p[i].dis<<" ";
        else cout<<2147483647<<" ";
    }
}
int main()
{
    for(int i=1;i<MAXN-5;i++) p[i].dis=1000000000;
    n=getint();m=getint();start=getint();
    for(register int i=1;i<=m;i++)
    {
        int u,v,w;
        u=getint();v=getint();w=getint();
        add(u,v,w);
        if(u==start) p[v].dis=w;
    }
    p[start].dis=0;
    p[start].number=start;
    q.push(p[start]);
    Dijkstra(start);
    return 0;
}
2021/4/24 21:51
加载中...