P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
迪杰斯克拉算法
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
#define ll long long
const int N=1e6+10;
const ll M=1e10+10;
int n,m,s;
struct node{
int to,next,w;
};
node ed[N];
int head[N],cnt=0;
struct disv{
ll dis;
int id;
bool operator < (const disv &a)const
{
return a.dis<dis;
}
};
priority_queue<disv> q;
ll dist[N];
bool vis[N];
void dijkstra()
{
dist[s]=0;
q.push((disv){0,s});
while(!q.empty())
{
auto t=q.top();
q.pop();
int u=t.id;
if(vis[u])
continue;
vis[u]=true;
for(int i=head[u];i;i=ed[i].next)
{
int v=ed[i].to;
if(dist[v]>dist[u]+ed[i].w)
{
dist[v]=dist[u]+ed[i].w;
if(!vis[v])
q.push((disv){dist[v],v});
}
}
}
}
void add(int u,int v,int w)//链式前向星加边
{
cnt++;
ed[cnt].w=w;
ed[cnt].to=v;
ed[cnt].next=head[u];
head[u]=cnt;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
dist[i]=M;
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
dijkstra();
for(int i=1;i<=n;i++)
{
cout<<dist[i]<<" ";
}
return 0;
}
P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
spfa算法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
const int M=0x7fffffff;
int n,m,s;
struct node{
int v,w;
};
typedef pair<int,int> pii;
vector<node>g[N];
queue<int>q;
int dist[N];
bool vis[N];
inline void read(int &x)//快读
{
x=0;
short flag=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
flag=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
x*=flag;
}
void spfa(int p)
{
q.push(p);
vis[p]=true;
dist[p]=0;
while(!q.empty())
{
auto t=q.front();
vis[t]=true;
for(auto i:g[t])
{
int v=i.v,w=i.w;
if(dist[v]>dist[t]+w)
{
dist[v]=dist[t]+w;
if(vis[v]==false)
{
vis[v]=true;
q.push(v);
}
}
}
q.pop();
vis[t]=false;
}
}
int main()
{
read(n);
read(m);
read(s);
for(int i=0;i<m;i++)
{
int u,v,w;
read(u),read(v),read(w);
g[u].push_back({v,w});
dist[i]=M;
}
spfa(s);
for(int i=1;i<=n;i++)
{
printf("%d ",dist[i]);
}
return 0;
}