61 lines
2 KiB
Markdown
61 lines
2 KiB
Markdown
|
---
|
||
|
id: func-graphs
|
||
|
title: Functional Graphs
|
||
|
author: Siyong Huang
|
||
|
prerequisites:
|
||
|
-
|
||
|
- Silver - Depth First Search
|
||
|
description: 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.
|
||
|
|
||
|
```cpp
|
||
|
//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
|
||
|
|
||
|
- [CSES Planets Cycles](https://cses.fi/problemset/task/1751)
|
||
|
- [CF 1020B. Badge (Very Easy)](https://codeforces.com/contest/1020/problem/B)
|
||
|
- Try to solve the problem in $O(N)$!
|
||
|
- USACO Silver
|
||
|
- [Swapity Swapity Swap (Very Hard)](http://www.usaco.org/index.php?page=viewproblem2&cpid=1014)
|
||
|
- permutation
|
||
|
- [The Bovine Shuffle (Normal)](http://usaco.org/index.php?page=viewproblem2&cpid=764)
|
||
|
- functional graph
|
||
|
- POI
|
||
|
- [Mafia](https://szkopul.edu.pl/problemset/problem/w3YAoAT3ej27YeiaNWjK57_G/site/?key=statement)
|
||
|
- [Spies](https://szkopul.edu.pl/problemset/problem/r6tMTfvQFPAEfQioYMCQndQe/site/?key=statement)
|
||
|
- [Frog](https://szkopul.edu.pl/problemset/problem/qDH9CkBHZKHY4vbKRBlXPrA7/site/?key=statement)
|