单源最短路径
题目描述
解题思路
d i j dij dij +堆优化
code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define pa pair<int,int>
using namespace std;
priority_queue<pa> q;
int n,m,s;
int v[100010];
int num[100010];
int hd[100010],tot;
struct abc{
int to,next,w;
}b[200010];
void add(int x,int y,int z)
{
b[++tot]=(abc){y,hd[x],z};
hd[x]=tot;
}
void dij(int st)
{
memset(num,0x3f3f3f3f,sizeof(num));
num[st]=0;
q.push(make_pair(0,st));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(v[x])
continue;
v[x]=1;
for(int i=hd[x];i;i=b[i].next)
{
int y=b[i].to;
if(num[y]>num[x]+b[i].w)
{
num[y]=num[x]+b[i].w;
q.push(make_pair(-num[y],y));
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dij(s);
for(int i=1;i<=n;i++)
cout<<num[i]<<" ";
}