Advertisement
coloriot

HA31_PDD(10)

Nov 15th, 2024
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <deque>
  5.  
  6. using namespace std;
  7.  
  8. class Edge {
  9. public:
  10.     int to;
  11.     int cost;
  12.     Edge(int t, int c) {
  13.         to = t;
  14.         cost = c;
  15.     }
  16. };
  17.  
  18. class Graph {
  19. private:
  20.     int N;
  21.     vector<vector<Edge> > adj;
  22. public:
  23.     Graph(int n) {
  24.         N = n;
  25.         adj.resize(N);
  26.     }
  27.  
  28.     void add_edge(int from, int to) {
  29.         adj[from].push_back(Edge(to, 0));
  30.         adj[to].push_back(Edge(from, 1));
  31.     }
  32.  
  33.     int zero_one_bfs(int start, int end) {
  34.         vector<int> dist(N, -1);
  35.         deque<int> dq;
  36.         dist[start] = 0;
  37.         dq.push_front(start);
  38.  
  39.         while (!dq.empty()) {
  40.             int v = dq.front();
  41.             dq.pop_front();
  42.  
  43.             if (v == end) {
  44.                 return dist[v];
  45.             }
  46.  
  47.             for (size_t i = 0; i < adj[v].size(); ++i) {
  48.                 int to = adj[v][i].to;
  49.                 int cost = adj[v][i].cost;
  50.  
  51.                 if (dist[to] == -1 || dist[to] > dist[v] + cost) {
  52.                     dist[to] = dist[v] + cost;
  53.                     if (cost == 0) {
  54.                         dq.push_front(to);
  55.                     } else {
  56.                         dq.push_back(to);
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.  
  62.         return -1;
  63.     }
  64. };
  65.  
  66. int main() {
  67.     int N, M;
  68.     cin >> N >> M;
  69.  
  70.     Graph graph(N);
  71.  
  72.     for (int i = 0; i < M; ++i) {
  73.         int A, B;
  74.         cin >> A >> B;
  75.         A--;
  76.         B--;
  77.         graph.add_edge(A, B);
  78.     }
  79.  
  80.     int K;
  81.     cin >> K;
  82.  
  83.     for (int q = 0; q < K; ++q) {
  84.         int S, F;
  85.         cin >> S >> F;
  86.         S--;
  87.         F--;
  88.  
  89.         int result = graph.zero_one_bfs(S, F);
  90.         cout << result << endl;
  91.     }
  92.  
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement