Submission #1255773

#TimeUsernameProblemLanguageResultExecution timeMemory
1255773amanthabandCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
125 ms17016 KiB
/////scc

/////1.make a dfs and find ending and starting node
/////2.reverse graph
/////3.again dfs


///end.
#include <bits/stdc++.h>
using namespace std;

#define fastio ios::sync_with_stdio(false); cin.tie(NULL);
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((int)(x).size())
#define rep(i,a,b) for(int i = a; i < b; ++i)
#define rrep(i,a,b) for(int i = a; i >= b; --i)

using ll = long long;
using pii = pair<int,int>;
using vi = vector<int>;
using vvi = vector<vector<pair<int,int>>>;
const int INF = 1e9;
template<typename T> using minpq = priority_queue<T, vector<T>, greater<T>>;
struct DSU {
      vi p, sz, mn;

      void init(int n) {
            p.resize(n);
            sz.assign(n, 1);
            mn.resize(n);
            iota(all(p), 0);
            iota(all(mn), 0);
      }

      int find(int x) {
            return x == p[x] ? x : p[x] = find(p[x]);
      }

      bool same(int x, int y) {
            return find(x) == find(y);
      }

      int size(int x) {
            return sz[find(x)];
      }

      int get_min(int x) {
            return mn[find(x)];
      }

      bool join(int x, int y) {
            x = find(x);
            y = find(y);
            if (x == y) return false;
            if (sz[x] < sz[y]) swap(x, y);
            p[y] = x;
            sz[x] += sz[y];
            mn[x] = min(mn[x], mn[y]);
            return true;
      }
};

int distt = 0;
set<pii> dijskra(int v, int t, vvi &adj, int src) {
      vi p(v+1, -1);
      vi dist(v+1, INF);
      minpq<pii> pq;
      dist[src] = 0;
      pq.push({0, src});

      while (!pq.empty()) {
            auto [d, u] = pq.top(); pq.pop();
            if (d > dist[u]) continue;
            for (auto [nxt, wt] : adj[u]) {
                  if (dist[nxt] > dist[u] + wt) {
                        dist[nxt] = dist[u] + wt;
                        p[nxt] = u;
                        pq.push({dist[nxt], nxt});
                  }
            }
      }
      distt = abs(dist[src] - dist[t]);
      set<pii> pass;
      for (int cur = t; p[cur] != -1; cur = p[cur]) {
            int a = cur, b = p[cur];
            if (a> b) swap(a,b);
            pass.insert({a, b});
      }
      return pass;
}

int digi2(int v, vvi &adj, int src,set<pii> pass,int end) {

      for (auto [a, b] : pass) {
            for (auto &pr : adj[a]) if (pr.first == b) pr.second = 0;
            for (auto &pr : adj[b]) if (pr.first == a) pr.second = 0;
      }


      vi dist(v+1, INF);
      minpq<pii> pq;
      dist[src] = 0;
      pq.push({0, src});

      while (!pq.empty()) {
            auto [d, u] = pq.top(); pq.pop();
            if (d > dist[u]) continue;
            for (auto [nxt, wt] : adj[u]) {
                  if (dist[nxt] > dist[u] + wt) {
                        dist[nxt] = dist[u] + wt;

                        pq.push({dist[nxt], nxt});
                  }
            }
      }
      distt = dist[end];
      return distt;

}

int main() {
      ios::sync_with_stdio(false);
      cin.tie(nullptr);

      int n, m; cin >> n >> m;
      int s, t; cin >> s >> t;
      int u, v; cin >> u >> v;

      vvi adj(n+1);
      for (int i = 0; i < m; i++) {
            int a, b, c; cin >> a >> b >> c;
            adj[a].push_back({b, c});
            adj[b].push_back({a, c});
      }

      set<pii> commuter_pass = dijskra(n, t, adj, s);

      
      int res = digi2(n,adj,u,commuter_pass,v);
      cout<<res<<endl;
      return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...