tarjan求助

灌水区

```cpp #include <bits/stdc++.h> using namespace std; int n, m, t = 0, cnt = 0; int point[10005]; vector<int> e[10005], a[10005]; int dfn[10005], low[10005], id[10005]; stack<int> st; int vis[10005]; void tarjan(int now) { if (dfn[now]) return; st.push(now), vis[now] = 1; dfn[now] = low[now] = ++ t; for (int i = 0; i < e[now].size(); i ++) { if (dfn[e[now][i]] == 0) { tarjan(e[now][i]); low[now] = min(low[now], low[e[now][i]]); } else if (vis[e[now][i]]) { low[now] = min(low[now], dfn[e[now][i]]); } } if (dfn[now] == low[now]) { cnt ++; while (!st.empty()) { int cur = st.top(); st.pop(); vis[cur] = 0, id[cur] = cnt; point[now] += point[cur]; if (cur == now) break; } } } void init() { for (int i = 1; i <= n; i ++) { for (int j = 0; j < e[i].size(); j ++) { if (id[e[i][j]] != id[i]) { a[id[i]].push_back(id[e[i][j]]); } } } } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i ++) { scanf("%d", &point[i]); } for (int i = 1; i <= m; i ++) { int x, y; scanf("%d %d", &x, &y); e[x].push_back(y); } for (int i = 1; i <= n; i ++ ) if (!dfn[i]) tarjan(i); init(); return 0; } ```
by __ycx2010__ @ 2024-04-18 15:30:17


|