add()中的两个建边有什么区别吗?
查看原帖
add()中的两个建边有什么区别吗?
622371
__zhangyx__楼主2023/10/6 15:38
#include<bits/stdc++.h>

using namespace std;

#define int long long
typedef pair<int,int> PII;

const int N = 1e6;
const int INF = 0x7f7f7f7f;

int n,m;
int e[2 * N + 5],ne[2 * N + 5],h[2 * N + 5],idx = 0;
int dp[1500][1500];

void add1(int a,int b) {
    e[++ idx] = b;
    ne[idx] = h[a];
    h[a] = idx;
}
void add2(int a,int b) {
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

void dfs(int u) {
    for (int k = h[u];k;k = ne[k]) {
        int v = e[k];
        dfs(v);
        for (int i = m + 1;i >= 1;i --) 
            for (int j = 0;j <= i - 1;j ++) 
                dp[u][i] = max(dp[u][i],dp[v][j] + dp[u][i - j]);    
    }
}

void solve() {
    cin >> n >> m;
    for (int i = 1;i <= n;i ++) {
        int u,v;
        cin >> u >> v;
        dp[i][1] = v;
        add1(u,i);
    }
    
    dfs(0);
    
    cout << dp[0][m + 1] << endl;
    
} 
 
signed main() {
    std::ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int T = 1;//cin >> T;
    while (T --) solve();
}

为什么用当中的add1可以可以过add2就过不了了

2023/10/6 15:38
加载中...