http://acm.nenu.edu.cn/judge/contest/view.action?cid=59#problem/K
#include<stdio.h>
#define MAX 100005
#include<queue>
using namespace std;
struct Point {
int x,w,next;
};
typedef struct Point P;
P a1[MAX],a2[MAX];
int N,M,X;
int Head1[MAX],Head2[MAX];
__int64 dis1[MAX],dis2[MAX];
void SPFA(P a[],int Head[],__int64 dis[]) {
int i,j,temp;
queue<int>Que;
while(!Que.empty()) Que.pop();
for(i=0; i<=N; i++) {
dis[i]=0x7f7f7f7f;
}
dis[X]=0;
Que.push(X);
while(!Que.empty()) {
temp=Que.front();
Que.pop();
for(i=Head[temp]; i!=-1; i=a[i].next) {
j=a[i].x;
if(dis[j]>dis[temp]+a[i].w) {
dis[j]=dis[temp]+a[i].w;
Que.push(j);
}
}
}
}
int main() {
int i,j,u,v,weight;
__int64 d[MAX];
while(~scanf("%d %d %d",&N,&M,&X)) {
for(i=0; i<=M; i++) {
Head1[i]=Head2[i]=-1;
}
for(i=0;i<M;i++) {
scanf("%d %d %d",&u,&v,&weight);
a1[i].x=v;
a1[i].next=Head1[u];
a1[i].w=weight;
Head1[u]=i;
a2[i].x=u;
a2[i].next=Head2[v];
a2[i].w=weight;
Head2[v]=i;
}
SPFA(a1,Head1,dis1);
SPFA(a2,Head2,dis2);
for(i=1; i<=N; i++) {
d[i]=dis1[i]+dis2[i];
}
int temp=0;
for(i=1; i<=N; i++) {
if(temp<d[i]) temp=d[i];
}
printf("%d\n",temp);
}
return 0;
}