Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <tuple>
  3. #include <vector>
  4. #include <queue> //priority queue
  5. #include <utility> //pair
  6. using namespace std;
  7. #define maxn 200006
  8. #define INF 12334857394875ll
  9. #define pii pair<long long,long long>
  10. long long dis1[maxn];
  11. long long dis2[maxn];
  12. vector<pii> G1[maxn];
  13. vector<pii> G2[maxn];
  14.  
  15. int t;
  16. long long n, m; // n nodes and m edges
  17. int a, b;//travel from a to b
  18. long long c, d, e; // it takes e to go from c to d
  19.  
  20. void dijk1(long long n) {
  21.     for (int i=0;i<=n;++i) {
  22.         dis1[i] = INF;
  23.     }
  24.     dis1[a] = 0; //從誰開始
  25.     priority_queue< pii, vector<pii>, greater<pii> > pq;
  26.     pq.push(make_pair(dis1[a],a));
  27.     while (!pq.empty()) {
  28.         pii p = pq.top();
  29.         pq.pop();
  30.         long long disid = p.first;
  31.         long long id = p.second;
  32.         if (dis1[id] != disid) continue;  // 如果新丟出來的單行道並不是最優的一條,就不討論它
  33.         for (pii q:G1[id]) {
  34.             long long to = q.first;
  35.             long long wei = q.second;
  36.             if (dis1[to] > disid + wei) {
  37.                 dis1[to] = disid + wei;
  38.                 pq.push(make_pair(dis1[to],to));
  39.             }
  40.         }
  41.     }
  42. }
  43.  
  44.  
  45. void dijk2(long long n) {
  46.     for (int i=0;i<=n;++i) {
  47.         dis2[i] = INF;
  48.     }
  49.     dis2[b] = 0; //從誰開始
  50.     priority_queue< pii, vector<pii>, greater<pii> > pq;
  51.     pq.push(make_pair(dis2[b],b));
  52.     while (!pq.empty()) {
  53.         pii p = pq.top();
  54.         pq.pop();
  55.         long long disid = p.first;
  56.         long long id = p.second;
  57.         if (dis2[id] != disid) continue;
  58.         for (pii q:G2[id]) {
  59.             long long to = q.first;
  60.             long long wei = q.second;
  61.             if (dis2[to] > disid + wei) {
  62.                 dis2[to] = disid + wei;
  63.                 pq.push(make_pair(dis2[to],to));
  64.             }
  65.         }
  66.     }
  67. }
  68. long long aa[maxn], ab[maxn], ac[maxn];
  69.  
  70. int main() {
  71.     ios::sync_with_stdio(0); cin.tie(0);
  72.     cin >> t;
  73.     for(int i=0; i<t; ++i){
  74.         for(int i=0; i<n; i++){
  75.             G1[i].clear();
  76.             G2[i].clear();
  77.         }
  78.         cin >> n>> m >> a >> b;
  79.        
  80.         for(int i=0; i<m; ++i){
  81.             cin >> c >> d>> e;
  82. //            x --> y, weight = z
  83. //            G[x].push_back(make_pair(y,z));
  84.             G1[c].push_back(make_pair(d,e));
  85.             G2[d].push_back(make_pair(c,e));
  86.  
  87.             aa[i]=c;
  88.             ab[i]=d;
  89.             ac[i]=e;
  90.            
  91. //            vector<tuple<int, int, int>> edges;
  92. //            tuple<int, int, int> edge = make_tuple(e, c, d);
  93. //            edges.push_back(edge);
  94.         }
  95.         dijk1(n);
  96.         dijk2(n);
  97.        
  98.         long long min=INF;
  99.         long long length;
  100. //        bool ok;
  101.         for(int i =0; i<m; i++){
  102.             length=dis1[aa[i]]+dis2[ab[i]]+ac[i];
  103.             if(length!=dis1[b]){
  104.                 if(length<min) min=length;
  105.             }
  106.         }
  107.         cout << (min-dis1[b]) << endl;
  108.     }
  109. }
  110.  
  111.  
  112. /*
  113. #define INF 12334857394875ll
  114. #define pii pair<int,int> pii;
  115. long long dis[maxn];
  116. vector<pii> G[maxn];
  117.  
  118. //x --> y, weight = z
  119. //G[x].push_back(make_pair(y,z));
  120.  
  121. void dijk(int n) {
  122.     for (int i=0;i<n;++i) {
  123.         dis[i] = INF;
  124.     }
  125.     dis[0] = 0;
  126.     prioirity_queue< pii, vector<pii>, greater<pii> > pq;
  127.     pq.push(make_pair(dis[0],0));
  128.     while (!pq.empty()) {
  129.         pii p = pq.top();
  130.         pq.pop();
  131.         int disid = p.first;
  132.         int id = p.second;
  133.         for (pii q:G[id]) {
  134.             int to = q.first;
  135.             int wei = q.second;
  136.             if (dis[to] > disid + wei) {
  137.                 dis[to] = disid + wei;
  138.                 pq.push(make_pair(dis[to],to));
  139.             }
  140.         }
  141.     }
  142. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement