一个MLE,一个WA,求改

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

stylus @ 2024-01-24 09:00:29

第一个(这个其实能过,但MLE了:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,h;
};
bool operator <(node a,node b){
    return a.h>b.h;
}
int n,m,s,a[10001][10001],d[10001],u,v,w;
void bfs(){
    priority_queue<node>q;
    q.push({s,0}),d[s]=0;
    while(q.size()){
        node s=q.top();
        q.pop();
        for(int i=1;i<=n;i++){
            if(a[s.x][i]==-1)continue;
            if(d[i]>d[s.x]+a[s.x][i])d[i]=d[s.x]+a[s.x][i],q.push({i,d[i]});
        }
    }for(int i=1;i<=n;i++)cout<<d[i]<<' ';
    return;
}
int main(){
    memset(a,-1,sizeof(a)),memset(d,114514,sizeof(d));
    cin>>n>>m>>s;
    for(int i=0;i<m;i++)cin>>u>>v>>w,a[u][v]=w;
    bfs();
    return 0;
}

然后我又改了一下(却错了:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,h;
};
bool operator <(node a,node b){
    return a.h>b.h;
}
int n,m,s,d[10001],u,v,w;
map<pair<int,int>,int>mp;
void bfs(){
    priority_queue<node>q;
    q.push({s,0}),d[s]=0;
    while(q.size()){
        node s=q.top();
        q.pop();
        for(int i=1;i<=n;i++){
            if(mp[{s.x,i}]==-1)continue;
            if(d[i]>d[s.x]+mp[{s.x,i}])d[i]=d[s.x]+mp[{s.x,i}],q.push({i,d[i]});
        }
    }for(int i=1;i<=n;i++)cout<<d[i]<<' ';
    return;
}
void init(){
    memset(d,114514,sizeof(d));
    mp.clear();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i!=j)mp[{i,j}]=-1;
        }
    }return;
}
int main(){
    init();
    cin>>n>>m>>s;
    for(int i=0;i<m;i++)cin>>u>>v>>w,mp[{u,v}]=w;
    bfs();
    return 0;
}

求大佬改正!!!


by __My0217__ @ 2024-01-24 10:37:21

@5520qq 但是后面算的时候会不会加个-1然后寄掉


by stylus @ 2024-01-24 10:45:12

@My0217 那个?


by __My0217__ @ 2024-01-24 10:51:15

@5520qq 就是初始化,你初始化成-1对吧,然后你后面直接判断是不是更短,然后那个-1加上去 答案就寄掉了


by stylus @ 2024-01-24 10:58:28

@My0217 所以怎么改呢?


by __My0217__ @ 2024-01-24 11:00:17

@5520qq 建议还是判一下 ==-1 continue


上一页 |