The hints of the problem has given detailed information to implement the topological sorting algorithm. In fact, the toposort algorithm of the hint is the BFS version, which uses the indegrees of each node.
The code is as follows.
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 struct DirectedGraphNode { 8 int label; 9 vector neighbors;10 DirectedGraphNode(int i) : label(i) {}11 };12 13 vector init_graph(int nodes) {14 vector graph(nodes);15 for (int i = 0; i < nodes; i++)16 graph[i] = new DirectedGraphNode(i);17 return graph;18 }19 20 vector compute_indegree(vector & graph) {21 vector degrees(graph.size(), 0);22 for (int i = 0; i < (int)graph.size(); i++)23 for (int j = 0; j < (int)graph[i] -> neighbors.size(); j++)24 degrees[graph[i] -> neighbors[j]]++;25 return degrees;26 }27 28 bool noCycle(vector & graph) {29 vector degrees = compute_indegree(graph);30 int nodes = graph.size();31 queue zeros;32 for (int i = 0; i < (int)degrees.size(); i++)33 if (!degrees[i]) zeros.push(i);34 while (!zeros.empty()) {35 int zero = zeros.front();36 zeros.pop();37 for (int i = 0; i < (int)graph[zero] -> neighbors.size(); i++)38 if (--degrees[graph[zero] -> neighbors[i]] == 0)39 zeros.push(graph[zero] -> neighbors[i]);40 nodes--;41 }42 return nodes == 0;43 }44 45 int main(void) {46 int cases;47 scanf("%d", &cases);48 for (int i = 0; i < cases; i++) {49 int nodes, edges;50 scanf("%d %d", &nodes, &edges);51 vector graph = init_graph(nodes);52 int node, neigh;53 for (int j = 0; j < edges; j++) {54 scanf("%d %d", &node, &neigh);55 graph[node - 1] -> neighbors.push_back(neigh - 1);56 }57 if (noCycle(graph)) printf("Correct\n");58 else printf("Wrong\n");59 }60 return 0;61 }