社区讨论
求助!!dijkstra只能得70分
P3371【模板】单源最短路径(弱化版)参与者 3已保存回复 14
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 14 条
- 当前快照
- 1 份
- 快照标识符
- @mi7e2h2f
- 此快照首次捕获于
- 2025/11/20 20:09 4 个月前
- 此快照最后确认于
- 2025/11/20 22:32 4 个月前
#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 条回复,欢迎继续交流。
正在加载回复...