40分,求调
查看原帖
40分,求调
1251134
鹿幽凌楼主2024/6/10 11:19
#include <bits/stdc++.h>
using namespace std;

const int N = 20005; // 点的数量(双倍)
int cnt; // cnt为计数
int low[N], num[N], dfn; // tarjan要用的 
int sccno[N], stk[N], top; // 栈
int a[N]; // 节点的点权 
int max_sum, cmax; // max_sum为最大的点权之和,cmax用来比较 
vector<int> G[N]; // 存图

void dfs(int u) {
    stk[top++] = u; // 节点入栈
    low[u] = num[u] = ++dfn; // 初始化
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i]; // 找出一条边上的节点
        if (!num[v]) {
            dfs(v); // 未访问的点,继续搜:) 
            low[u] = min(low[v], low[u]); // 向上传递low 
        } 
        else if (!sccno[v])
            low[u] = min(low[u], num[v]); // 处理回退边
    }
    if (low[u] == num[u]) {
        cnt++;
        cmax = 0;
        while (1) {
            int v = stk[--top];
            sccno[v] = cnt;
            cmax += a[v];
            if (cmax > max_sum)
                max_sum = cmax;
            if (u == v) break;
        }
    }        
} 

void Tarjan(int n) {
    cnt = top = dfn = 0; // 初始化
    memset(sccno, 0, sizeof(sccno)); // 初始化
    memset(num, 0, sizeof(num)); 
    memset(low, 0, sizeof(low));
    for (int i = 1; i <= n; i++)
        if (!num[i])
            dfs(i);
} 

int main() {
    int n, m, u, v;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 0; i < m; i++) {
        cin >> u >> v;
        G[u].push_back(v);
    }
    max_sum = 0;
    Tarjan(n);
    cout << max_sum << endl;
    return 0;
}

求调,研究半天,还是不知道哪里错了

2024/6/10 11:19
加载中...