Submission details
Task:Road network
Sender:PLS2020
Submission time:2020-10-03 15:52:13 +0300
Language:C++ (C++11)
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.01 sdetails
#30.01 sdetails
#4ACCEPTED0.01 sdetails
#5ACCEPTED0.01 sdetails
#60.11 sdetails
#7ACCEPTED0.11 sdetails
#8ACCEPTED0.09 sdetails
#90.16 sdetails
#10ACCEPTED0.12 sdetails
#11ACCEPTED0.01 sdetails

Code

#include <vector>
#include <iostream>
#include <queue>


int main(void) {
  int n, m;

  std::ios_base::sync_with_stdio(false);

  std::cin >> n;
  std::cin >> m;

  std::vector<std::vector<int>> routes(n + 1);

  for (int i = 0; i < m; ++i) {
    int a;
    int b;

    std::cin >> a;
    std::cin >> b;

    routes[a].push_back(b);
  }

  std::vector<bool> solution(n + 1);

  // If we've reached the intersection from the
  // currently processed node. It is written into
  // the array, if we haven't reached that node it will
  // be out of date
  std::vector<int> reached(n + 1);

  for (int i = 1; i < n + 1; ++i) {
    std::queue<int> q;
    std::vector<int> visited;

    q.push(i);

    while (!q.empty()) {
      int node = q.front();
      q.pop();

      reached[node] = i;
      visited.push_back(node);

      // If we can already reach every other node from this one, stop
      if (solution[node]) {
        solution[i] = true;
        for (auto v : visited) {
          solution[v] = true;
        }
        break;
      }

      for (int c : routes[node]) {
        if (reached[c] != i) {
          q.push(c);
        }
      }
    }

    if (solution[i]) {
      continue;
    }

    for (int r = 1; r < n + 1; ++r) {
      if (reached[r] != i) {
        std::cout << "NO" << std::endl;
        std::cout << i << " " << r << std::endl;
        return 0;
      }
    }

    solution[i] = true;
  }

  std::cout << "YES" << std::endl;
  return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
10 20
8 1
9 5
6 10
6 1
...

correct output
NO
7 1

user output
NO
7 1

Test 2

Verdict: ACCEPTED

input
10 20
2 10
10 6
8 5
3 8
...

correct output
NO
1 2

user output
NO
1 2

Test 3

Verdict:

input
10 20
10 2
1 5
8 3
5 6
...

correct output
NO
9 1

user output
YES

Test 4

Verdict: ACCEPTED

input
10 20
9 6
10 4
7 2
10 5
...

correct output
NO
6 1

user output
NO
6 1

Test 5

Verdict: ACCEPTED

input
10 20
5 9
10 2
3 5
7 4
...

correct output
YES

user output
YES

Test 6

Verdict:

input
100000 200000
64780 62469
32706 84268
37795 14893
23995 68041
...

correct output
NO
40590 1

user output
YES

Test 7

Verdict: ACCEPTED

input
100000 200000
74725 92399
25141 53472
70762 85785
47091 71621
...

correct output
NO
96983 1

user output
NO
96983 1

Test 8

Verdict: ACCEPTED

input
100000 200000
50342 88741
55031 42206
24989 54546
666 39964
...

correct output
NO
1 68638

user output
NO
1 68638

Test 9

Verdict:

input
100000 200000
51243 54643
90493 3012
62110 9430
5809 45601
...

correct output
NO
48024 1

user output
YES

Test 10

Verdict: ACCEPTED

input
100000 200000
5524 49109
87052 72192
46434 18442
67624 38661
...

correct output
YES

user output
YES

Test 11

Verdict: ACCEPTED

input
7 10
1 2
2 1
1 4
5 4
...

correct output
NO
2 3

user output
NO
1 3