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 }

 

posted @ 2018-10-13 20:15  huluxin  阅读(112)  评论(0编辑  收藏  举报