【記憶化+判環】P2921 [USACO08DEC]在農場萬聖節Trick or Treat on the Farm

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int n;
 5 int nextval[100010];
 6 int sum[100010];
 7 int circle[100010];
 8 int mark;
 9 bool vis[100010];
10 
11 int dfs(int node, int cnt)
12 {
13     if (circle[node] != 0) return cnt - 1 + circle[node];
14     if (vis[node] == true)
15     {
16         circle[node] = cnt - sum[node];
17         mark = node;
18         return cnt - 1;
19     }
20     vis[node] = true;
21     sum[node] = cnt;
22     int ans;
23     ans = dfs(nextval[node], cnt + 1);
24     if (mark)
25     {
26         if (node == mark) mark = 0;
27         else circle[node] = circle[mark];
28     }
29     else circle[node] = circle[nextval[node]] + 1;
30     vis[node] = false;
31     return ans;
32 }
33 
34 int main()
35 {
36     cin >> n;
37     for (int i = 1; i <= n; i++)
38         cin >> nextval[i];
39     for (int i = 1; i <= n; i++)
40         cout << dfs(i, 1) << endl;
41 }
View Code
相關文章
相關標籤/搜索