Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <deque>
- using namespace std;
- class Edge {
- public:
- int to;
- int cost;
- Edge(int t, int c) {
- to = t;
- cost = c;
- }
- };
- class Graph {
- private:
- int N;
- vector<vector<Edge> > adj;
- public:
- Graph(int n) {
- N = n;
- adj.resize(N);
- }
- void add_edge(int from, int to) {
- adj[from].push_back(Edge(to, 0));
- adj[to].push_back(Edge(from, 1));
- }
- int zero_one_bfs(int start, int end) {
- vector<int> dist(N, -1);
- deque<int> dq;
- dist[start] = 0;
- dq.push_front(start);
- while (!dq.empty()) {
- int v = dq.front();
- dq.pop_front();
- if (v == end) {
- return dist[v];
- }
- for (size_t i = 0; i < adj[v].size(); ++i) {
- int to = adj[v][i].to;
- int cost = adj[v][i].cost;
- if (dist[to] == -1 || dist[to] > dist[v] + cost) {
- dist[to] = dist[v] + cost;
- if (cost == 0) {
- dq.push_front(to);
- } else {
- dq.push_back(to);
- }
- }
- }
- }
- return -1;
- }
- };
- int main() {
- int N, M;
- cin >> N >> M;
- Graph graph(N);
- for (int i = 0; i < M; ++i) {
- int A, B;
- cin >> A >> B;
- A--;
- B--;
- graph.add_edge(A, B);
- }
- int K;
- cin >> K;
- for (int q = 0; q < K; ++q) {
- int S, F;
- cin >> S >> F;
- S--;
- F--;
- int result = graph.zero_one_bfs(S, F);
- cout << result << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement