求大佬指点一下spfa
#include<iostream>
#include <list>
#include<cstring>
using namespace std;
int n,m;
#define maxn 100009
struct head
{
int next;
int last;
head():next(-1),last(-1){}
};
head had[maxn];
struct edge
{
int next;
int to;
int cost;
edge():next(-1){}
};
edge ed[2*maxn];
void create(int sta,int end ,int cost ,int index)
{
if(had[sta].next==-1)
{
had[sta].next=index;
ed[index].cost=cost;
ed[index].to=end;
had[sta].last=index;
}
else
{
int in=had[sta].last;
ed[in].next=index;
ed[index].cost=cost;
ed[index].to=end;
had[sta].last=index;
}
}
int ans[maxn];
int vis[maxn]={0};
void SPFA(int start)
{
for(int i=1;i<=n;i++)
ans[i]=-1;
list<int> li;
ans[start]=0;
li.push_back(start);
vis[start]=1;
while (!li.empty())
{
int s=li.front();
vis[start]=0;
li.pop_front();
for(int i=had[s].next;i!=-1;i=ed[i].next)
{
int end=ed[i].to;
if(ans[end]==-1||ans[end]>ans[s]+ed[i].cost)
{
ans[end]=ans[s]+ed[i].cost;
if(vis[end]==0)
{
vis[end]=1;
li.push_back(end);
}
}
}
}
}
int main()
{
int s;
cin>>n>>m>>s;
int sta,end,cost;
for(int i=0;i<m;i++)
{
cin>>sta>>end>>cost;
create(sta,end,cost,i);
}
SPFA(s);
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
}