P3371 【模板】单源最短路径(弱化版)
Floyd算法
O
(
n
3
)
O(n^3)
O(n3)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+10,inf=2147483647;
int n,m,s,dis[N][N];
int main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=inf;
}
}
for(int x,y,w,i=1;i<=m;i++){
cin>>x>>y>>w;
dis[x][y]=min(w,dis[x][y]);
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(i==k||dis[i][k]==inf)continue;
for(int j=1;j<=n;j++){
if(dis[k][j]==inf) continue;
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
dis[s][s]=0;
for(int i=1;i<=n;i++){
cout<<dis[s][i]<<" ";
}
}
Dijkstra算法
O
(
(
n
+
m
)
l
o
g
n
)
O((n+m)logn)
O((n+m)logn)
#include<iostream>
#include<algorithm>
#include<limits.h>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e4+10,inf=INT_MAX,M=5e5+10;
int n,m,s,tot,head[N],vis[N],dis[N];
struct Edge{
int to,next,w;
}e[M];
priority_queue<pair<int,int>> q;
void add(int x,int y,int w){
e[++tot].to=y;
e[tot].w=w;
e[tot].next=head[x];
head[x]=tot;
}
void dijkstra(){
while(q.size())q.pop();
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0;
q.push({0,s});
while(q.size()){
int x=q.top().second;q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to,w=e[i].w;
if(dis[y]>dis[x]+w){
dis[y]=dis[x]+w;
q.push({-dis[y],y});
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int u,v,w,i=1;i<=m;i++){
cin>>u>>v>>w;
add(u,v,w);
}
dijkstra();
for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
}
P4779 【模板】单源最短路径(标准版)
- 将上题中
D
i
j
k
s
t
r
a
Dijkstra
Dijkstra算法的
n
n
n的数据范围修改为
1
0
5
+
10
10^5+10
105+10即可