有 n 个点 m 条单向边,起点为 x,问从每一个点 i 到 x 的距离 + 从 x 到 i 的距离最大是多少
开始建一个有向图,再将有向图的起点与终点置换,两次以 x 为起点的 SPFA 即可
const int M=1e5+5;
const int N=1000+5;
int n,m,t;
int i,j,k;
vector<Pair> E[M];
bool inq[N];
int d[N];
void init()
{
for(i=0;i<N;i++)
{
E[i].clear();
inq[i]=0;
d[i]=inf;
}
}
void SPFA(int s)
{
inq[s]=1; d[s]=0;
queue<int> q;
q.push(s);
while(q.size()){
int u=q.front();
q.pop();
inq[u]=0;
int cnt=E[u].size();
for(int i=0;i<cnt;i++){
int v=E[u][i].fr;
int w=E[u][i].sc;
if(w+d[u]<d[v]){
d[v]=d[u]+w;
if(!inq[v]){
inq[v]=1;
q.push(v);
}
}
}
}
}
int u[M],v[M],w[M];
int ans[N];
int main()
{
//IOS;
for(int x;sddd(n,m,x)==3;){
init();
for(i=1;i<=m;i++){
sddd(u[i],v[i],w[i]);
E[u[i]].pb( mp(v[i],w[i]) );
}
SPFA(x);
for(i=0;i<=n;i++) ans[i]=d[i];
init();
for(i=1;i<=m;i++){
E[v[i]].pb( mp(u[i],w[i]) );
}
SPFA(x);
int maxx=0;
for(i=0;i<=n;i++){
maxx=max(maxx,ans[i]+d[i]);
}
pd(maxx);
}
//PAUSE;
return 0;
}