求问该代码为什么最短路算法

P4779 【模板】单源最短路径(标准版)

海洋守卫者 @ 2024-10-25 15:00:12

rt,求其正确性

P4779 P3371

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<map>
#define int long long
using namespace std;
int n,m,s,h[100004],d[100004],dis[100004],ans[100004],ec;
struct Edge{
    int u,v,nxt,w;
}e[200004];
inline void Add(int u,int v,int w)
{
    d[v]++,e[++ec].u=u,e[ec].v=v,e[ec].nxt=h[u],e[ec].w=w,h[u]=ec;
}
typedef pair<int,int> P;
priority_queue<P,vector<P>,greater<P> >que;
main()
{
    scanf("%lld %lld %lld",&n,&m,&s);
    memset(dis,-1,sizeof dis);
    for(int i=1,u,v,w;i<=m;i++)scanf("%lld %lld %lld",&u,&v,&w),Add(u,v,w);
    que.push(P(0,s));
    while(!que.empty())
    {
        int t=que.top().first,i=que.top().second;
        que.pop();
        if(dis[i]>=0)continue;
        dis[i]=t;
        for(int j=h[i];j;j=e[j].nxt)
        {
            int v=e[j].v,w=e[j].w;
            que.push(P(t+w,v));
        }
    }
    for(int i=1;i<=n;i++)printf("%lld ",dis[i]);
    return 0;
}

by _liuyi_ @ 2024-10-25 15:02:07

这不是 dij 吗,不过复杂度好像是假的?


by Fish_ht @ 2024-10-25 15:03:52

@海洋守卫者 是Dij,只是将vis数组替换为判断dis是否大于等于0。时间复杂度也是 O(m\log m)


by 海洋守卫者 @ 2024-10-25 15:04:55

@Fish_ht %%%,非常感谢


|