#include #include #include #include using namespace std; int main() { int n, m; cin >> n >> m; vector> adj(n, vector()); vector> back_adj(n, vector()); for(int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; adj[b].push_back(a); back_adj[a].push_back(b); } vector component(n, 0); vector nodes(n, 0); for(int i = 0; i < n; i++) { nodes[i] = i; } auto rng = default_random_engine{}; shuffle(begin(nodes), end(nodes), rng); int num_components = 0; for(int root : nodes) { if(component[root] <= 0) { num_components++; component[root] = -num_components; stack s; s.push(root); while(!s.empty()) { int cur = s.top(); s.pop(); for(int nb : adj[cur]) { if(component[nb] <= 0 && component[nb] != -num_components) { component[nb] = -num_components; s.push(nb); } } } component[root] = num_components; s.push(root); while(!s.empty()) { int cur = s.top(); s.pop(); for(int nb : back_adj[cur]) { if(component[nb] == -num_components) { component[nb] = num_components; s.push(nb); } } } } } vector dag_out_edges(num_components, 0); for(int i = 0; i < n; i++) { for(int nb : adj[i]) { if(component[i] != component[nb]) { dag_out_edges[component[i] - 1]++; } } } int result = 0; for(int ct : dag_out_edges) { result += (ct == 0); } cout << result << endl; }