#include <bits/stdc++.h>
using namespace std;
#define maxim(X, Y) (X = max(X, Y))
const int MXN = 1e3, Z = 5e3;
int N, M, A[Z], B[Z], C[Z], p[MXN], d[MXN];
int cd[Z];
vector<int> g[MXN], h[MXN];
void init(int u) {
for(const int &v : g[u]) {
for(int &w : g[v]) if(u == w) swap(w, g[v].back());
g[v].pop_back();
p[v] = u;
d[v] = d[u] + 1;
init(v);
}
}
int lca(int u, int v) {
for(; u != v; d[u] > d[v] ? u = p[u] : v = p[v]);
return u;
}
int getIdx(int u, int v) {
for(int i = 0; 1; ++i) if(g[u][i] == v) return i;
}
const int NB = 1023;
int dp[MXN][1<<10];
void dfs(int u) {
for(const int &v : g[u]) if(v != p[u]) dfs(v);
for(const int &i : h[u]) {
int cur {};
for(int v : {A[i], B[i]}) if(u != v) {
cur += dp[v][NB];
int w = v; v = p[v];
for(; u != v; w = v, v = p[v])
cur += dp[v][NB^(1<<getIdx(v, w))];
cd[i] ^= 1<<getIdx(u, w);
}
maxim(dp[u][cd[i]], cur + C[i]);
}
for(int i = 1; i <= NB; ++i) {
for(int j = 0; j < 10; ++j) if(i & (1<<j))
maxim(dp[u][i], dp[u][i ^ (1<<j)] + (j < int(size(g[u])) ? dp[g[u][j]][NB] : 0));
for(const int &j : h[u]) if((i & cd[j]) == cd[j])
maxim(dp[u][i], dp[u][i ^ cd[j]] + dp[u][cd[j]]);
}
}
int main() {
cin >> N >> M;
for(int i = 0; i < M; ++i) {
cin >> A[i] >> B[i] >> C[i];
--A[i], --B[i];
if(!C[i]) {
g[A[i]].push_back(B[i]);
g[B[i]].push_back(A[i]);
}
}
init(0);
for(int i = 0; i < M; ++i) if(C[i]) {
if(!((d[A[i]] ^ d[B[i]]) & 1))
h[lca(A[i], B[i])].push_back(i);
}
dfs(0);
cout << accumulate(C, C + M, 0) - dp[0][NB];
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
356 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
596 KB |
Output is correct |
2 |
Correct |
3 ms |
596 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
46 ms |
4500 KB |
Output is correct |
2 |
Correct |
48 ms |
4552 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
356 KB |
Output is correct |
2 |
Correct |
1 ms |
340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
468 KB |
Output is correct |
2 |
Correct |
2 ms |
468 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
724 KB |
Output is correct |
2 |
Correct |
6 ms |
772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
1508 KB |
Output is correct |
2 |
Correct |
16 ms |
1524 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
31 ms |
2420 KB |
Output is correct |
2 |
Correct |
29 ms |
2380 KB |
Output is correct |
3 |
Correct |
27 ms |
2448 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
55 ms |
4432 KB |
Output is correct |
2 |
Correct |
54 ms |
4448 KB |
Output is correct |
3 |
Correct |
59 ms |
4536 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
28 ms |
2312 KB |
Output is correct |
2 |
Correct |
29 ms |
2408 KB |
Output is correct |
3 |
Correct |
53 ms |
4452 KB |
Output is correct |
4 |
Correct |
27 ms |
2444 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
58 ms |
4448 KB |
Output is correct |
2 |
Correct |
52 ms |
4556 KB |
Output is correct |
3 |
Correct |
60 ms |
4452 KB |
Output is correct |
4 |
Correct |
59 ms |
4524 KB |
Output is correct |