POJ 3268
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <iomanip> 10 #include <climits> 11 using namespace std; 12 int n,m,x,d[1100],d1[1100]; 13 vector<pair<int,int> >e[1100]; 14 vector<pair<int,int> >g[1100]; 15 int main(int argc, char *argv[]) 16 { 17 scanf("%d%d%d",&n,&m,&x); 18 for(int i=0;i<=n;i++) 19 { 20 d[i]=1e9;d1[i]=1e9; 21 } 22 for(int i=0;i<m;i++) 23 { 24 int x,y,z; 25 scanf("%d%d%d",&x,&y,&z); 26 e[x].push_back(make_pair(y,z)); 27 g[y].push_back(make_pair(x,z)); 28 } 29 d[x]=0; 30 priority_queue<pair<int,int> >q; 31 q.push(make_pair(-d[x],x)); 32 while(!q.empty()) 33 { 34 int now=q.top().second; 35 q.pop(); 36 for(int i=0;i<e[now].size();i++) 37 { 38 int v=e[now][i].first; 39 if(d[v]>d[now]+e[now][i].second) 40 { 41 d[v]=d[now]+e[now][i].second; 42 q.push(make_pair(-d[v],v)); 43 } 44 } 45 } 46 d1[x]=0; 47 q.push(make_pair(-d1[x],x)); 48 while(!q.empty()) 49 { 50 int now=q.top().second; 51 q.pop(); 52 for(int i=0;i<g[now].size();i++) 53 { 54 int v=g[now][i].first; 55 if(d1[v]>d1[now]+g[now][i].second) 56 { 57 d1[v]=d1[now]+g[now][i].second; 58 q.push(make_pair(-d1[v],v)); 59 } 60 } 61 } 62 int mmax=0; 63 for(int i=1;i<=n;i++) 64 { 65 if(d[i]!=1e9&&d1[i]!=1e9) 66 mmax=max(mmax,d[i]+d1[i]); 67 } 68 printf("%d\n",mmax); 69 return 0; 70 }