DFS+回溯 找最小环
每个人知道自己的生日,每次把自己知道的生日告诉固定的一个人,问最少多少次之后能从别人口中听到自己的生日
找一个最小环
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define SZ 200005 #define INF 1e9+10 int to[SZ], ins[SZ], ans = INF, dist[SZ], vis[SZ]; //ins = in stack void dfs(int x) { if(vis[x]) return; vis[x] = 1; int t = to[x]; if(ins[t]) { ans = min(ans, dist[x] - dist[t] + 1); return; } ins[x] = 1; dist[t] = dist[x] + 1; dfs(t); ins[x] = 0; } int main() { int n, x; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &x); to[i] = x; } for(int i = 1; i <= n; i++) { if(!vis[i]) { dist[i] = 1; dfs(i); } } printf("%d ", ans); return 0; }