【悬赏三关注】家人们这题恶心死了不想调了

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

Literally114514 @ 2023-10-03 23:53:03

本来自己写的还对只是超时,现在照着题解打优化版都是错的,家人们谁懂啊恶心死了啊啊啊

。。。。。。

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int n,m,u,v,w,distant,ver,cnt=0,p;//cnt=编号 
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
struct node{
    int to;
    int w;
    int next;
};
int dist[100010];
bool used[100010];
node edge[100010];
int head[100010];
void add_edge(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
    cnt++;
}
int main(){
    cin>>n>>m>>p;
    for(int i=1;i<=m;i++){
        cin>>u>>v>>w;
        add_edge(u,v,w);
        //distant=first,end=second
    }
    memset(dist,0x3f,sizeof(dist));
    dist[1]=0;
    q.push({0,1});
    while(q.size()){
        auto k=q.top();
        q.pop(); 
        distant=k.first;
        ver=k.second;
        if(used[ver]) continue;
        used[ver]=1;
        for(int i=head[ver];i!=0;i=edge[i].next){
            int j=edge[i].to;
            if(edge[i].w+distant < dist[j]){
                dist[j]=edge[i].w+distant;
                q.push({dist[j],j});
            }
        }
    }
    for(int i=1;i<=n;i++) cout<<dist[i]<<' ';
}

by DANNNqwq @ 2023-10-03 23:55:59

是从s出发而不是从1出发


by Literally114514 @ 2023-10-03 23:57:56

@DANNNsth 题目中说s就是1


by 洛天依_ @ 2023-10-03 23:58:11

讯飞星火说: 这段代码存在一个问题:

在add_edge函数中,将新边添加到邻接表中时,没有正确初始化next指针。这导致在后续遍历邻接表时,可能会出现未定义的行为。

为了修复这个问题,我们需要在add_edge函数中为每个新边分配一个空的next指针。修改后的代码如下所示:

void add_edge(int u, int v, int w) {
    edge[cnt].to = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];  // Initialize next pointer to NULL
    head[u] = cnt++;
}

这样,在后续遍历邻接表时,就能正确地通过next指针访问到各个出边,并计算最短路径了。


by DANNNqwq @ 2023-10-04 00:00:07

@Literally 题目什么时候说s=1了???


by Literally114514 @ 2023-10-04 00:01:38

@DANNNsth 看说明/提示。。。。。


by Literally114514 @ 2023-10-04 00:02:49

@洛天依_ 讯飞大聪明啊,就加了一注释。。。。。。。。。。。。。。。。


by DANNNqwq @ 2023-10-04 00:03:55

@Literally edge结构体开小了


by lwyzhx @ 2023-10-04 00:04:22

1)数组开小了

2)

void add_edge(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
    cnt++;
}

更改为

void add_edge(int u,int v,int w){
    edge[++cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
}

by DANNNqwq @ 2023-10-04 00:05:20

@Literally add函数应该先++cnt在建边


by Literally114514 @ 2023-10-04 00:14:19

@DANNNsth thx @blue_wine thx


| 下一页