这个东西相对于SPFA较为稳定,但是他其实是一种贪心算法,所以————dijkstra算法跑不了负权图。
dijkstra的算法核心就是贪心,我们每次把离初始点最近的但加入集合,知道目标点加入集合,此时就是最短路径。
#include<bits/stdc++.h>
using namespace std;
int n,m,k,x,y,z,d[100001];
struct data
{
int x,y;
bool operator < (const data &a) const {
return y>a.y;
}
};
vector<data> a[100001];
priority_queue<data> q;
inline int read()
{
int sum=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
sum=(sum<<1)+(sum<<3)+ch-'0';
ch=getchar();
}
return sum;
}
int main()
{
n=read();
m=read();
k=read();
memset(d,0x7f7f7f,sizeof(d));
d[k]=0;
for(int i=1;i<=m;i++)
{
x=read();
y=read();
z=read();
a[x].push_back((data){
y,z
});
}
q.push((data){
k,0
});
while(!q.empty())
{
data u=q.top();
q.pop();
if(u.y!=d[u.x])
{
continue;
}
for(int i=0;i<a[u.x].size();i++)
{
data v=a[u.x][i];
if(d[u.x]+v.y<d[v.x])
{
d[v.x]=d[u.x]+v.y;
q.push((data)
{
v.x,d[u.x]+v.y
});
}
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",d[i]);
}
}