DuongNhi99

BUS 70%

Dec 10th, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. const int N = 50005;
  6.  
  7. typedef pair<ll, ll> ii;
  8.  
  9. struct pt {
  10.     ll u, v, w;
  11. };
  12.  
  13. ll n, m, s, t;
  14. vector<pt> a[N];
  15.  
  16. pt A[N], B[N];
  17. ll nB, nA;
  18. bool kt = false;
  19. ll d[3][N], parent[N];
  20.  
  21. void Dijkstra(ll s, ll q) {
  22.     priority_queue<ii, vector<ii>, greater<ii> >pq;
  23.  
  24.     for(int i = 1; i <= n; i++)
  25.         d[q][i] = 1e18;
  26.     d[q][s] = 0;
  27.     pq.push({0, s});
  28.  
  29.     while(pq.size()) {
  30.         ll u = pq.top().second;
  31.         ll du = pq.top().first;
  32.         pq.pop();
  33.  
  34.         if(du != d[q][u]) continue;
  35.  
  36.         for(int i = 0; i < a[u].size();i++) {
  37.             ll v = a[u][i].u;
  38.             ll uv = a[u][i].w;
  39.  
  40.             if(max(du , uv) < d[q][v]) {
  41.                 d[q][v] = max(du, uv);
  42.                 pq.push({d[q][v], v});
  43.             }
  44.         }
  45.     }
  46. }
  47.  
  48. bool comp(pt a, pt b) {
  49.     return a.w < b.w;
  50. }
  51.  
  52. ll get_parent(ll u) {
  53.     if (parent[u] == 0)
  54.         return u;
  55.     return parent[u] = get_parent(parent[u]);
  56. }
  57.  
  58. bool join(ll u, ll v) {
  59.     ll x = get_parent(u);
  60.     ll y = get_parent(v);
  61.  
  62.     if (x == y) return 0;
  63.     parent[x] = y;
  64.     return 1;
  65. }
  66.  
  67. ll Sub13(){
  68.     Dijkstra(s, 0);
  69.     //Sub1
  70.     if(!kt) return d[0][t];
  71.  
  72.     //Sub3
  73.     ll ans = d[0][t];
  74.     Dijkstra(t, 1);
  75.     for(int i = 1; i <= nB; i++){
  76.         ll x = min(
  77.             max(d[0][B[i].u], d[1][B[i].v]),
  78.             max(d[0][B[i].v], d[1][B[i].u])
  79.         );
  80.  
  81.         ans = min(ans, x + B[i].w);
  82.     }
  83.     return ans;
  84. }
  85.  
  86. ll Sub2(){
  87.     sort(B + 1, B + nB + 1, comp);
  88.     sort(A + 1, A + nA + 1, comp);
  89.     ll ans = 1e18;
  90.  
  91.     for(int k = 1; k <= nA; k++) {
  92.         memset(parent, 0, sizeof(parent));
  93.  
  94.         for(int i = 1; i <= k; i++)
  95.             join(A[i].u, A[i].v);
  96.  
  97.         for(int j = 1; j <= nB; j++) {
  98.             join(B[j].u, B[j].v);
  99.  
  100.             if(get_parent(s) == get_parent(t)){
  101.                 ans = min(ans, B[j].w + A[k].w);
  102.                 break;
  103.             }
  104.         }
  105.     }
  106.  
  107.     return ans;
  108. }
  109.  
  110. int main() {
  111.     //freopen("in.txt", "r", stdin);
  112.     freopen("BUS.inp", "r", stdin);
  113.     freopen("BUS.out", "w", stdout);
  114.     ios_base::sync_with_stdio(false);
  115.     cin.tie(NULL); cout.tie(NULL);
  116.  
  117.     cin >> n >> m >> s >> t;
  118.     for(int i = 1; i <= m; i++) {
  119.         ll k, u, v, w;
  120.         cin >> k >> u >> v >> w;
  121.  
  122.         if(k == 1) {
  123.             a[u].push_back({v, k, w});
  124.             a[v].push_back({u, k, w});
  125.         }
  126.  
  127.         if(k == 2)
  128.             B[++nB] = {u, v, w};
  129.         else
  130.             A[++nA] = {u, v, w};
  131.  
  132.         if(k == 2) kt = true;
  133.     }
  134.  
  135.     if(m <= 5000) cout << Sub2();
  136.     else cout << Sub13();
  137. }
  138.  
Add Comment
Please, Sign In to add comment