Advertisement
yungyao

tioj 1509

Jan 25th, 2021
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. using namespace std;
  2. #include <iostream>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <utility>
  8. #include <bitset>
  9. #include <memory.h>
  10. #include <set>
  11. #include <string>
  12.  
  13. #define pb push_back
  14. #define pii pair<int,int>
  15. #define F first
  16. #define S second
  17. #define LL long long
  18.  
  19. /*
  20. 8e7 so dian
  21. FHVirus so dian
  22. youou so dian
  23. KYW so dian
  24. hubert so dian
  25. jass so dian
  26. tingyu so dian
  27. */
  28.  
  29. //IO
  30. #define theyRSOOOOOOOOODIAN ios_base::sync_with_stdio(false),cin.tie(0);
  31. #define endl '\n'
  32.  
  33. //workspace
  34. vector <pii> out[1000100],ret[1000100];
  35. int dis[1000100];
  36.  
  37. int main(){
  38.     theyRSOOOOOOOOODIAN
  39.     int m,n;
  40.  
  41.     cin >> m >> n;
  42.     for (int i=0;i<n;++i){
  43.         int p,q,r;
  44.  
  45.         cin >> p >> q >> r;
  46.         out[p].pb({q,r});
  47.         ret[q].pb({p,r});
  48.     }
  49.     for (int i=1;i<=m;++i)
  50.         dis[i] = 1e9+10;
  51.  
  52.     int relaxed = 1;
  53.     pii cur;
  54.     dis[1] = 0;
  55.     priority_queue <pii,vector<pii>,greater<pii>> pq;
  56.     pq.push({0,1});
  57.  
  58.     for (int i=0;i<m;++i){
  59.         do{
  60.             cur = pq.top();
  61.             pq.pop();
  62.         }while (pq.size() && cur.F > dis[cur.S]);
  63.  
  64.         for (auto i:out[cur.S]){
  65.             if (dis[i.F] > cur.F + i.S){
  66.                 dis[i.F] = cur.F + i.S;
  67.                 pq.push({dis[i.F],i.F});
  68.             }
  69.         }
  70.     }
  71.  
  72.     int ans = 0;
  73.     for (int i=1;i<=m;++i){
  74.         if (dis[i] == 1e9+10){
  75.             cout << '0';
  76.             return 0;
  77.         }
  78.         ans += dis[i],dis[i] = 1e9+10;
  79.     }
  80.     while (pq.size())
  81.         pq.pop();
  82.     dis[1] = 0;
  83.     pq.push({0,1});
  84.  
  85.     for (int i=0;i<m;++i){
  86.         do{
  87.             cur = pq.top();
  88.             pq.pop();
  89.         }while (pq.size() && cur.F > dis[cur.S]);
  90.  
  91.         for (auto i:ret[cur.S]){
  92.             if (dis[i.F] > cur.F + i.S){
  93.                 dis[i.F] = cur.F + i.S;
  94.                 pq.push({dis[i.F],i.F});
  95.             }
  96.         }
  97.     }
  98.  
  99.     for (int i=1;i<=m;++i){
  100.         if (dis[i] == 1e9+10){
  101.             ans = 0;
  102.             break;
  103.         }
  104.         ans += dis[i];
  105.     }
  106.    
  107.     cout << ans;
  108.  
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement