貌似懂了什么=-=
AC代码
```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,head,tail,len1,len2,maxx=-1,s;
int dis1[1001],dis2[1001],team[1001],head1[1001],head2[1001];
bool visited[1001];
struct edge
{
int next,to,dis;
}w1[100001],w2[100001];
void add1(int from,int to,int dis)
{
w1[++len1].next=head1[from];
w1[len1].to=to;
w1[len1].dis=dis;
head1[from]=len1;
}
void add2(int from,int to,int dis)
{
w2[++len2].next=head2[from];
w2[len2].to=to;
w2[len2].dis=dis;
head2[from]=len2;
}
void spfa1()
{
int i;
head=0;tail=1;dis1[s]=0,visited[s]=true;team[1]=s;
while(head<tail)
{
head++;
int u=team[head];
visited[u]=false;
for(i=head1[u];i!=0;i=w1[i].next)
if(dis1[w1[i].to]>dis1[u]+w1[i].dis)
{
dis1[w1[i].to]=dis1[u]+w1[i].dis;
if(!visited[w1[i].to])
{
tail++;
team[tail]=w1[i].to;
visited[w1[i].to]=true;
}
}
}
}
void spfa2()
{
int i;
head=0;tail=1;dis2[s]=0;visited[s]=true;team[1]=s;
while(head<tail)
{
head++;
int u=team[head];
visited[u]=false;
for(i=head2[u];i!=0;i=w2[i].next)
if(dis2[w2[i].to]>dis2[u]+w2[i].dis)
{
dis2[w2[i].to]=dis2[u]+w2[i].dis;
if(!visited[w2[i].to])
{
tail++;
team[tail]=w2[i].to;
visited[w2[i].to]=true;
}
}
}
}
int main()
{
int i,j,x,y,z;
cin>>n>>m>>s;
for(i=1;i<=m;++i)
{
cin>>x>>y>>z;
add1(y,x,z);
add2(x,y,z);
}
memset(dis1,0x7fffffff/6,sizeof(dis1));
memset(dis2,0x7fffffff/6,sizeof(dis2));
memset(visited,false,sizeof(visited));
spfa1();
memset(visited,false,sizeof(visited));
memset(team,0,sizeof(team));
spfa2();
for(i=1;i<=n;++i)
maxx=max(maxx,dis1[i]+dis2[i]);
cout<<maxx;
}
```
by 养猪大户 @ 2017-08-26 16:20:19
我FOLYD都只超时2个点
by 时崎狂三老公 @ 2017-08-30 14:27:42
@[养猪大户](/space/show?uid=49794) 大佬,请问您的team数组是干什么用的?
by si_zhong @ 2018-07-01 09:46:26