java爬蟲模擬登陸的例項詳解
阿新 • • 發佈:2021-01-19
狀態表示:\(f(i)\)表示從\(i\)開始的所有食物鏈的集合,儲存個數屬性
狀態計算:\(f(i) = f(j_1)+f(j_2)+...+f(j_k)+...\),其中\(j_k\)為\(i\)的第\(k\)個後繼結點
思路:從每一個最大的捕食者出發跑一遍記憶化,把從他開始的所有食物鏈的個數加上。
#include<iostream> #include<cstring> using namespace std; const int N = 5010, M = 5000010, mod = 80112002; int h[N], e[M], ne[M], idx; int n, m; int in[N]; int f[N]; void add(int a, int b){ e[idx] = b, ne[idx] = h[a], h[a] = idx ++; } int dfs(int u){ if(f[u]) return f[u]; for(int i = h[u]; i != -1; i = ne[i]){ int j = e[i]; f[u] = (f[u] + dfs(j)) % mod; } if(f[u] == 0) f[u] = 1; return f[u]; } int main(){ memset(h, -1, sizeof h); cin >> n >> m; while(m --){ int a, b; cin >> a >> b; add(b, a); in[a] ++; } int res = 0; for(int i = 1; i <= n; i ++) if(in[i] == 0) res = (res + dfs(i)) % mod; cout << res; }