社区讨论

求助!!dijkstra只能得70分

P3371【模板】单源最短路径(弱化版)参与者 3已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mi7e2h2f
此快照首次捕获于
2025/11/20 20:09
4 个月前
此快照最后确认于
2025/11/20 22:32
4 个月前
查看原帖
谁能告诉我下?
CPP
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
#define INF 9999999
#define dashu 2147483647
#define MAXN 10010
#define MAXM 500010
struct edge{
    int from,to,v;
};
vector <edge> edges;
vector <int> G[MAXM];
int n,m,s,dis[MAXN],vis[MAXN];
void addedge(int x,int y,int z){
    edges.push_back((edge){x,y,z});
    G[x].push_back(edges.size() - 1);
}
void dijkstra(int s){
    for(register int i = 1;i <= n;i++){
        dis[i] = INF;
        vis[i] = 0;
    }
    for(register int i = 0;i < G[s].size();i++){
        dis[edges[G[s][i]].to] = edges[G[s][i]].v;
    }
    dis[s] = 0;
    vis[s] = 1;
    while(1){
        int u = -1;
        for(register int i = 1;i <= n;i++){
            if(!vis[i] && (u == -1 || dis[i] < dis[u])){
                u = i;
            }
        }
        if(u == -1){
            break;
        }
        vis[u] = 1;
        for(register int i = 0;i < G[u].size();i++){
            dis[edges[G[u][i]].to] = min(dis[edges[G[u][i]].to],edges[G[u][i]].v + dis[u]);
        }
    }
}
int main(){
    scanf("%d %d %d",&n,&m,&s);
    for(register int i = 1;i <= m;i++){
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        addedge(x,y,z);
    }
    dijkstra(s);
    for(register int i = 1;i <= n;i++){
        if(dis[i] == INF){
            cout<<dashu<<" ";
        }else{
            cout<<dis[i]<<" ";
        }
    }
    return 0;
}

回复

14 条回复,欢迎继续交流。

正在加载回复...