#include #include #include #include using namespace std; struct Edge { int from, to; }; int main() { int nodeCount = 0; int edgeCount = 0; cin >> nodeCount >> edgeCount; vector> edges; vector possibleStart; edges.reserve(nodeCount + 1); possibleStart.reserve(nodeCount + 1); for (int i = 0; i <= nodeCount; ++i) { edges.emplace_back(set()); possibleStart.emplace_back(true); } possibleStart.at(0) = false; for (int i = 0; i < edgeCount; ++i) { int from, to; cin >> from >> to; edges.at(from).insert(to); possibleStart.at(to) = false; } int start = -1; for (int i = 1; i < nodeCount; ++i) { if (possibleStart.at(i)) { start = i; break; } } if (start == -1) { cout << "FAIL" << endl; } queue queue; queue.push(start); set open; open.insert(start); int removeCount = 0; while (!queue.empty()) { int pos = queue.front(); queue.pop(); for (int nb : edges.at(pos)) { if (open.count(nb) == 0) { queue.push(nb); open.insert(nb); } else { removeCount++; } } } cout << removeCount << endl; return 0; }