This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/4_Silver/Func_Graphs.md
2020-06-22 10:26:06 -04:00

2 KiB

id title author prerequisites description
func-graphs Functional Graphs Siyong Huang
Silver - Depth First Search
Introduces functional graphs.

Tutorial

  • CPH 16.3: successor paths
  • CPH 16.4: cycle detection in successor graph

In silver-level directed cycle problems, it is generally the case that each node has exactly one edge going out of it. This is known as a successor graph or a functional graph.

The following sample code counts the number of cycles in such a graph. The "stack" contains nodes that can reach the current node. If the current node points to a node v on the stack (on_stack[v] is true), then we know that a cycle has been created. However, if the current node points to a node v that has been previously visited but is not on the stack, then we know that the current chain of nodes points into a cycle that has already been considered.

//UNTESTED

//Each node points to next_node[node]

bool visited[MAXN], on_stack[MAXN];
int number_of_cycles = 0, next_node[MAXN];
void dfs(int n)
{
  visited[n] = on_stack[n] = true;
  int u = next_node[n];
  if(on_stack[u])
    number_of_cycles++;
  else if(!visited[u])
    dfs(u);
  on_stack[n] = false;
}
int main()
{
  //read input, etc
  for(int i = 1;i <= N;i++)
    if(!visited[i])
      dfs(i);
}

(floyd's algo?)

Problems