POJ - 3268
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,x;
struct node{
vector<pair<int,int> > p;
}path[1005],path2[1005];
struct cmp{
bool operator()(pair<int,int> a,pair<int,int> b){
if(a.second>b.second)return true;
return false;
}
};
int dis[1005];
int book[1005];
int ans1[1005],ans2[1005];
void dijk(int x){
for(int i=1;i<=n;i++){
if(i!=x)dis[i]=inf;
else dis[i]=0;
}
fill(book,book+1005,0);
priority_queue<pair<int,int> ,vector<pair<int,int> >,cmp> que;
que.push(pair<int,int>(x,0));
for(int i=0;i<path[x].p.size();i++){
que.push(pair<int,int>(path[x].p[i]));
}
while(!que.empty()){
pair<int,int> t=que.top();
que.pop();
int u=t.first;
// if(dis[u]<t.second)continue;//注释掉速度居然更快 暂时不清楚为什么 可能是数据不存在这种情况但是需要进行<判断
for(int i=0;i<path[u].p.size();i++){
if(dis[path[u].p[i].first]>dis[u]+path[u].p[i].second){
dis[path[u].p[i].first]=dis[u]+path[u].p[i].second;
que.push(path[u].p[i]);
}
}
}
}
void dijk2(int x){
for(int i=1;i<=n;i++){
if(i!=x)dis[i]=inf;
else dis[i]=0;
}
fill(book,book+1005,0);
priority_queue<pair<int,int> ,vector<pair<int,int> >,cmp> que;
que.push(pair<int,int>(x,0));
for(int i=0;i<path2[x].p.size();i++){
que.push(pair<int,int>(path2[x].p[i]));
}
while(!que.empty()){
pair<int,int> t=que.top();
que.pop();
int u=t.first;
// if(dis[u]<t.second)continue;
for(int i=0;i<path2[u].p.size();i++){
if(dis[path2[u].p[i].first]>dis[u]+path2[u].p[i].second){
dis[path2[u].p[i].first]=dis[u]+path2[u].p[i].second;
que.push(path2[u].p[i]);
}
}
}
}
int main(){
while(~scanf("%d%d%d",&n,&m,&x)){
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
path[a].p.push_back(pair<int,int>(b,c));
path2[b].p.push_back(pair<int,int>(a,c));
}
dijk(x);//x点到其他各点
for(int i=1;i<=n;i++){
ans1[i]=dis[i];
}
dijk2(x);//其他各点到x点
for(int i=1;i<=n;i++){
ans2[i]=dis[i];
}
int max=0;
for(int i=1;i<=n;i++){
if(max<(ans1[i]+ans2[i]))max=ans1[i]+ans2[i];
}
cout<<max<<endl;
}
return 0;
}