思路
因为是有向图且求去会最长的路所以用 Spfa 正向遍历一遍反向便利一遍就行
head 数组要初始化两次
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int head[1010],d[1010],s[1010];
int cnt,n,m,x,h[100010][3];
bool vis[1010];
struct node
{
int u;
int v;
int w;
int next;
}p[100010];
void add(int u,int v,int w)
{
p[cnt].u=u;
p[cnt].v=v;
p[cnt].w=w;
p[cnt].next=head[u];
head[u]=cnt++;
}
void spfa()
{
for(int i=1;i<=n;i++)
{
d[i]=inf;
vis[i]=0;
}
queue<int>q;
q.push(x);
vis[x]=1;
d[x]=0;
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=0;
for(int i=head[t];i!=-1;i=p[i].next)
{
node e=p[i];
if(d[e.v]>d[e.u]+e.w)
{
d[e.v]=d[e.u]+e.w;
if(!vis[e.v])
{
vis[e.v]=1;
q.push(e.v);
}
}
}
}
for(int i=1;i<=n;i++)
s[i]+=d[i];
}
int main()
{
cnt=0;
scanf("%d%d%d",&n,&m,&x);
memset(head,-1,sizeof(head)); //初始化
memset(s,0,sizeof(s));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&h[i][0],&h[i][1],&h[i][2]); //将输入存到一个二维数组中以利于下次反向便利
add(h[i][0],h[i][1],h[i][2]);
}
spfa();
memset(head,-1,sizeof(head)); //记得便利前初始化
for(int i=1;i<=m;i++)
add(h[i][1],h[i][0],h[i][2]);
spfa();
sort(s+1,s+n+1);
printf("%d\n",s[n]);
return 0;
}