Mouse Hunt
阿新 • • 發佈:2018-08-19
include ace pri -- algo int use esp cpp
Mouse Hunt
給定一個n個點的圖,每個點有權值\(c_i\),並且只有一條出邊。現在你要在一些點上打標記,使得從任何一個點出發最終都會經過有標記的點。求標記點的權值和最小值。
就是找環啊!拓撲排序啊!
#include <cstdio> #include <algorithm> using namespace std; const int maxn=2e5+5; int n, c[maxn], a[maxn], in[maxn], vis[maxn]; int q[maxn], h, t, ans; int dfs(int now){ vis[now]=1; if (vis[a[now]]) return c[now]; return min(c[now], dfs(a[now])); } int main(){ scanf("%d", &n); int now; for (int i=1; i<=n; ++i) scanf("%d", &c[i]); for (int i=1; i<=n; ++i){ scanf("%d", &a[i]); ++in[a[i]]; } for (int i=1; i<=n; ++i) if (!in[i]) q[t++]=i; while (h<t){ now=q[h++]; --in[a[now]]; if (!in[a[now]]) q[t++]=a[now]; } for (int i=1; i<=n; ++i) if (in[i]&&!vis[i]) ans+=dfs(i); printf("%d\n", ans); return 0; }
Mouse Hunt