两点注意。
第一点,建反边spfa完美解决去程的问题。
第二点,有些是永远也到不了的,要舍掉这些距离!!!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define maxv 1005
#define maxe 100005
using namespace std;
queue <long long> q;
struct edge
{
long long v,w,nxt;
}e1[maxe],e2[maxe];
long long n,m,k,dis1[maxv],dis2[maxv],a,b,c;
long long g1[maxv],g2[maxv],nume1=0,nume2=0;
bool vis[maxv];
void addedge(long long u,long long v,long long w)
{
e1[++nume1].v=v;
e1[nume1].w=w;
e1[nume1].nxt=g1[u];
g1[u]=nume1;
e2[++nume2].v=u;
e2[nume2].w=w;
e2[nume2].nxt=g2[v];
g2[v]=nume2;
}
void spfa()
{
memset(dis1,0x3f,sizeof(dis1));
memset(dis2,0x3f,sizeof(dis2));
memset(vis,false,sizeof(vis));
while (!q.empty())
q.pop();
q.push(k);
vis[k]=true;
dis1[k]=0;
while (!q.empty())
{
long long head=q.front();
q.pop();
for (long long i=g1[head];i;i=e1[i].nxt)
{
long long v=e1[i].v;
if (dis1[v]>dis1[head]+e1[i].w)
{
dis1[v]=dis1[head]+e1[i].w;
if (vis[v]==false)
{
q.push(v);
vis[v]=true;
}
}
}
vis[head]=false;
}
memset(vis,false,sizeof(vis));
while (!q.empty())
q.pop();
q.push(k);
vis[k]=true;
dis2[k]=0;
while (!q.empty())
{
long long head=q.front();
q.pop();
for (long long i=g2[head];i;i=e2[i].nxt)
{
long long v=e2[i].v;
if (dis2[v]>dis2[head]+e2[i].w)
{
dis2[v]=dis2[head]+e2[i].w;
if (vis[v]==false)
{
q.push(v);
vis[v]=true;
}
}
}
vis[head]=false;
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for (long long i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
addedge(a,b,c);
}
spfa();
for (long long i=1;i<=n;i++)
dis1[i]=dis1[i]+dis2[i];
sort(dis1+1,dis1+n+1);
for (int i=n;i>=1;i--)
{
if (dis1[i]<10000000)
{
printf("%d
",dis1[i]);
break;
}
}
return 0;
}