不知道怎么错了 只过了第一个 悬赏5关注!!

P3387 【模板】缩点

```cpp #include <stdio.h> #include <stack> #include <stdlib.h> #include <iostream> #include <queue> #include <algorithm> #define N 10050 using namespace std; typedef struct EDGE { int next, to; int from; }E; E edge[N * 20]; E ed[N*20]; int indu[N]; int h[N]; int root[N]; int num; void addd(int x, int y) { num++; ed[num].from = x; ed[num].to = y; ed[num].next = h[x]; h[x] = num; } int w[N]; int head[20 * N], dfn[N], low[N]; int du[N], id[N]; bool insta[N]; int idx, cnt, n, m; stack<int>s; inline void add(int x, int y) { cnt++; edge[cnt].to = y; edge[cnt].from = x; edge[cnt].next = head[x]; head[x] = cnt; } void tarjan(int x) { dfn[x] = low[x] = ++idx; s.push(x); insta[x] = 1; for (int i = head[x]; i; i = edge[i].next) { int v = edge[i].to; if (!dfn[v]) { tarjan(v); low[x] = min(low[v], low[x]); } else if(insta[v])low[x] = min(dfn[v], low[x]); } int k ; if (dfn[x] == low[x]) { do { k = s.top(); s.pop(); id[k] = x; insta[k] = 0; if (k == x)break; w[x] += w[k]; } while (k != x); } }queue<int>q; int dis[N];//定义在函数外面以保证初值为0 int Tuopu() { for (int i = 1; i <= n; i++) { if (indu[i] == 0 &&id[i]==i) { q.push(i); dis[i]=w[i]; } } while (!q.empty()) {//这个while循环应放在外面啊,怎么写里面去了,是缩进的问题吗 int k = q.front(); q.pop(); for (int i = h[k]; i; i = ed[i].next) { int v = ed[i].to; dis[v] = max(dis[v], dis[k]+w[v]); indu[v]--; if (indu[v] == 0)q.push(v); } } int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, dis[i]); return ans; } int main() { cin >> n >> m; int u, v; for (int i = 1; i <= n; i++) cin >> w[i]; for (int i = 1; i <= m; i++) { cin >> u >> v; add(u, v); } for (int i = 1; i <= n; i++) { if (!dfn[i]) tarjan(i); } for (int i = 1; i <= m; i++) { int x = edge[i].from, y = edge[i].to; if (id[x] != id[y]) { addd(id[x], id[y]); indu[id[y]]++; } } printf("%d", Tuopu()); return 0; } ```
by pj114514 @ 2023-07-11 19:48:53


顺带提一嘴,您的代码里有两个废数组,root和du数组
by pj114514 @ 2023-07-11 19:50:11


哎呀,才看到您的另一个帖子已经有人回复了,不好意思哈哈
by pj114514 @ 2023-07-11 19:52:24


|