Submission #610550

#TimeUsernameProblemLanguageResultExecution timeMemory
610550dooompyTraining (IOI07_training)C++17
72 / 100
1089 ms2396 KiB
#include <bits/stdc++.h>

using namespace std;

struct edge {
    int a, b, c, lca;
};

vector<edge> edges, fe;
int total = 0;
vector<int> adj[1005];

int tin[1005], timer = 1;
int jmp[1005][12], depth[1005];
int col[1005];
pair<int, int> par[1005];
int deg[1005];
int dp[1005][1 << 11];

void dfs(int node) {
    tin[node] = timer++;

    for (int i = 1; i < 12; i++) jmp[node][i] = jmp[jmp[node][i-1]][i-i];

    for (auto nxt : adj[node]) {
        if (tin[nxt]) continue;
        if (col[node] == 1) {
            col[nxt] = 2;
        } else col[nxt] = 1;
        par[nxt] = {node, (1 << deg[node]++)};
        depth[nxt] = depth[node] + 1;
        jmp[nxt][0] = node;
        dfs(nxt);
    }
}

int lca(int a, int b) {
    if (depth[a] > depth[b]) swap(a, b);

    for (int i = 11; i >= 0; i--) {
        if (depth[jmp[b][i]] >= depth[a]) b = jmp[b][i];
    }

    if (a == b) return a;

    for (int i = 11; i >= 0; i--) {
        if (jmp[a][i] != jmp[b][i]) {
            a = jmp[a][i]; b = jmp[b][i];
        }
    }

    return jmp[a][0];
}

int main() {
    int n, m; cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int a, b, c; cin >> a >> b >> c;
        total += c;
        if (c == 0) {
            adj[a].push_back(b); adj[b].push_back(a);
        }

        edges.push_back({a, b, c});
    }

    col[1] = 1;
    jmp[1][0] = 1;
    depth[1] = 1;

    dfs(1);

    for (auto e: edges) {
        if (col[e.a] == col[e.b]) fe.push_back({e.a, e.b, e.c, lca(e.a, e.b)});
        else if (e.c == 0) fe.push_back({e.a, e.b, e.c, lca(e.a, e.b)});
    }

    sort(fe.begin(), fe.end(), [&](edge a, edge b) {
        return tin[a.lca] > tin[b.lca];
    });

    for (auto e : fe) {
        int tot = e.c;
        int finalmask = 0;
        int mask = 0;
        for (int i = e.a; i != e.lca; mask = par[i].second, i = par[i].first) {
            tot += dp[i][mask];
        }
        finalmask |= mask;
        mask = 0;
        for (int i = e.b; i != e.lca;mask = par[i].second, i = par[i].first) {
            tot += dp[i][mask];
        }
        finalmask |= mask;

        for (int mk = (1 << deg[e.lca]) - 1; mk >= 0 ; mk--) {
            if (mk & finalmask) continue;
            dp[e.lca][mk] = max(dp[e.lca][mk], dp[e.lca][mk | finalmask] + tot);
        }

    }
    cout << total - dp[1][0];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...