WA40求助

P3387 【模板】缩点

```cpp #include <iostream> #include <queue> #define INF 0x3f3f3f using namespace std; struct ln { int u, v, nxt; } a[50010], p[50010]; int n, m, r, ta, b; int dfn[5010], prc[5010], h2d[5010], l2nsz, anstot, anslist[5010], f[5010], chu[5010], ru[5010], colsz[5010], col[5010], stck[5010], stcktt, low[5010], lnsz, hd[5010], tot, colcnt, mx, mxcl; int sscpr[5010]; bool vis[50010]; void add(int u, int v) { a[++lnsz].u = u; a[lnsz].v = v; a[lnsz].nxt = hd[u]; hd[u] = lnsz; } void add2(int u, int v) { p[++l2nsz].u = u; p[l2nsz].v = v; p[l2nsz].nxt = h2d[u]; h2d[u] = l2nsz; ru[v]++; } queue<int> q; void tarjan(int u) { dfn[u] = low[u] = ++tot; stck[++stcktt] = u; vis[u]=true; for (int i = hd[u]; i; i = a[i].nxt) { int v = a[i].v; if (!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if (vis[v]) low[u] = min(low[u], dfn[v]); } if (dfn[u] == low[u]) { int k; while(k = stck[stcktt--]) { col[k] = u; vis[k]=false; if(u==k)break; sscpr[col[u]] += prc[k]; } } } int topsort() { for (int i = 1; i <= n; i++) if (col[i]==i&&!ru[i]){ q.push(i); anslist[i] = sscpr[i]; } int te; while (!q.empty()) { te = q.front(); q.pop(); for (int i = h2d[te]; i; i = p[i].nxt) { #define T p[i].v anslist[T] = max(anslist[T], anslist[te] + sscpr[col[T]]); ru[T]--; if (!ru[T]) q.push(T); #undef T } } anstot=0; for (int i = 1; i <= n; i++) anstot = max(anstot, anslist[i]); return anstot; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> prc[i]; } for (int i = 1; i <= m; i++) { cin >> ta >> b; add(ta, b); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int i = 1; i <= m; i++) { if (col[a[i].u] != col[a[i].v]) { add2(a[i].u, a[i].v); } } cout << topsort() << endl; return 0; } /* 10 20 970 369 910 889 470 106 658 659 916 964 3 2 3 6 3 4 9 5 8 3 5 8 9 1 9 7 9 8 7 5 3 7 7 8 1 7 10 2 1 10 4 8 2 6 3 1 3 5 8 5 6911 */ ```
by _TLEer_的小号 @ 2021-01-13 13:41:29


对于 $100\%$ 的数据,$1\le n \le 10^4,1\le m \le 10^5$,点权 $\in [0,1000]$ 看清楚!
by lichenghan @ 2021-04-06 16:14:00


@[_TLEer_的小号](/user/362101) ```cpp #include <iostream> #include <queue> #define INF 0x3f3f3f using namespace std; // const int MAXN = 10010, MAXE = 100010; struct ln { int u, v, nxt; } a[MAXE], p[MAXE]; int n, m, r, ta, b; int dfn[MAXN], prc[MAXN], h2d[MAXN], l2nsz, anstot, anslist[MAXN], f[MAXN], chu[MAXN], ru[MAXN], colsz[MAXN], col[MAXN], stck[MAXN], stcktt, low[MAXN], lnsz, hd[MAXN], tot, colcnt, mx, mxcl; int sscpr[MAXN]; bool vis[MAXN]; void add(int u, int v) { a[++lnsz].u = u; a[lnsz].v = v; a[lnsz].nxt = hd[u]; hd[u] = lnsz; } void add2(int u, int v) { p[++l2nsz].u = u; p[l2nsz].v = v; p[l2nsz].nxt = h2d[u]; h2d[u] = l2nsz; ru[v]++; } queue<int> q; void tarjan(int u) { dfn[u] = low[u] = ++tot; stck[++stcktt] = u; vis[u] = true; for (int i = hd[u]; i; i = a[i].nxt) { int v = a[i].v; if (!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if (vis[v]) low[u] = min(low[u], dfn[v]); } if (dfn[u] == low[u]) { int k; while (k = stck[stcktt--]) { col[k] = u; vis[k] = false; //if (u == k) // break; //sscpr[col[u]] += prc[k]; sscpr[u] += prc[k]; if (u == k) break; } } } int topsort() { for (int i = 1; i <= n; i++) if (col[i] == i && !ru[i]) { q.push(i); anslist[i] = sscpr[i]; } int te; while (!q.empty()) { te = q.front(); q.pop(); for (int i = h2d[te]; i; i = p[i].nxt) { #define T p[i].v anslist[T] = max(anslist[T], anslist[te] + sscpr[col[T]]); ru[T]--; if (!ru[T]) q.push(T); #undef T } } anstot = 0; for (int i = 1; i <= n; i++) anstot = max(anstot, anslist[i]); return anstot; } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> prc[i]; } for (int i = 1; i <= m; i++) { cin >> ta >> b; add(ta, b); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int i = 1; i <= m; i++) { if (col[a[i].u] != col[a[i].v]) { //add2(a[i].u, a[i].v); add2(col[a[i].u], col[a[i].v]); } } cout << topsort() << endl; return 0; } ```
by metaphysis @ 2021-06-10 09:32:37


@[metaphysis](/user/333388) 谢谢!
by _TLEer_的小号 @ 2021-06-11 22:56:57


|