加边直接adde(rd(),rd(),rd());导致的玄学问题

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

Yantttttt @ 2023-10-21 09:56:16

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2e5+10;

int n,m,s;
int head[N],ver[M],edge[M],nxt[M],tot=0;
int d[N];
bool v[N];
priority_queue<pair<int,int> > q;

int rd()
{
    int f=1,k=0;char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }   
    while(c>='0'&&c<='9')
    {
        k=k*10+c-'0';
        c=getchar();
    }
    return f*k;
}

void adde(int x,int y,int z)
{
    edge[++tot]=z;
    ver[tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}

void dijkstra(int s)
{
    memset(d,0x3f,sizeof(d));
    memset(v,0,sizeof(v));
    d[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty())
    {
        int x=q.top().second;q.pop();
        if(v[x]) continue;
        v[x]=1;
        for(int i=head[x];i;i=nxt[i])
        {
            int y=ver[i],z=edge[i];
            if(d[y]>d[x]+z)
            {
                d[y]=d[x]+z;
                q.push(make_pair(-d[y],y));
            }
        }
    }
}

int main()
{
    n=rd();m=rd();s=rd();
    for(int i=1;i<=m;i++)
    {   
        adde(rd(),rd(),rd());
    }
    dijkstra(s);
    for(int i=1;i<=n;i++)
    {
        printf("%d ",d[i]);
    }
    return 0;
}

这样会WA。

但是79行加边改成这样就能过:

    for(int i=1;i<=m;i++)
    {
        int x=rd(),y=rd(),z=rd();
        adde(x,y,z);
    }

为什么啊


by Sprague_Garundy @ 2023-10-21 09:57:17

函数参数表的运算顺序在 C++17 以前是未定义的


by Argvchs @ 2023-10-21 09:58:11

@Yantttttt ub,函数调用求值顺序是不确定的


by Yantttttt @ 2023-10-21 09:59:51

%%%感谢大佬 祝各位rp++;


by Argvchs @ 2023-10-21 10:00:26

@Sprague_Garundy C++17 以后也是不确定的


by Sprague_Garundy @ 2023-10-21 10:04:07

@Argvchs C++17 后默认从后往前吧


by Argvchs @ 2023-10-21 10:07:37

@Sprague_Garundy

https://zh.cppreference.com/w/cpp/language/eval_order

求值任何表达式的任何部分,包括求值函数参数的顺序未指明(除了下列的一些例外)。

C++17 前函数参数求值顺序是 unspecified 的

15) 函数调用表达式中,每个形参的初始化的值计算和副作用相对于任何其他形参的初始化的值计算和副作用是顺序不确定的。(C++17 起)

C++17 起函数参数求值顺序是不确定的


by Sprague_Garundy @ 2023-10-21 10:10:34

@Argvchs 号,那是我记错了


|