This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct edge {
int a,b,c,lca;
edge(int a, int b, int c) {
this->a=a;
this->b=b;
this->c=c;
this->lca=-1;
}
};
vector<vector<int>> neighbors;
vector<bool> visited, visited2;
vector<edge> edges;
vector<vector<int>> path;
vector<int> degree;
vector<int> lvl;
vector<pair<int, int>> parent;
int dg=0;
void dfs(int node) {
for(int i: neighbors[node]) {
if(visited2[i]) continue;
visited2[i]=true;
parent[i].first=node;
parent[i].second=1<<lvl[node];
lvl[node]++;
dfs(i);
}
degree[node]=dg;
dg++;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,m;
int total = 0;
cin >> n >> m;
neighbors = vector<vector<int>>(n, vector<int>());
visited = vector<bool>(n);
visited2 = vector<bool>(n);
path = vector<vector<int>>(n);
lvl = vector<int>(n);
degree = vector<int>(n);
parent = vector<pair<int, int>>(n);
for(int i = 0; i < m; i++) {
int a,b,c;
cin >> a >> b >> c;
a--;
b--;
edges.push_back(edge(a,b,c));
if(c==0) {
neighbors[a].push_back(b);
neighbors[b].push_back(a);
}
total+=c;
}
visited[0]=true;
deque<int> q;
visited2[0]=true;
dfs(0);
q.push_back(0);
while(q.size()) {
int x = q.front();
q.pop_front();
path[x]=path[parent[x].first];
path[x].push_back(x);
for(int i: neighbors[x]) {
if(visited[i]) continue;
visited[i]=true;
q.push_back(i);
}
}
/*
for(int i = 0; i < n; i++) {
cout << i << endl;
for(int j: path[i]) cout << j << " ";
cout << endl;
}
*/
for(int j = 0; j < edges.size(); j++) {
edge &e = edges[j];
//cout << e.a << " " << e.b << " " << e.c << " " << path[e.a].size() << " " << path[e.b].size() << endl;
for(int i = 1; i < min(path[e.a].size(), path[e.b].size()); i++) {
if(path[e.a][i]!=path[e.b][i]) {
e.lca=path[e.a][i-1];
}
}
if(e.lca==-1) {
if(path[e.a].size()<path[e.b].size()) {
e.lca=path[e.a].back();
} else {
e.lca=path[e.b].back();
}
}
}
sort(begin(edges), end(edges), [](const edge a, const edge b) -> bool{
return degree[a.lca]<degree[b.lca];
});
/*
for(edge e: edges) {
cout << e.a << " " << e.b << " " << e.c << " " << e.lca << endl;
}
cout << "PARENT" << endl;
for(int i = 0; i < 5; i++) {
cout << i << " " << parent[i].first << " " << parent[i].second << endl;
}
*/
//cout << "line 113" << endl;
vector<vector<int>> dp(n, vector<int>(1<<10));
for(edge e: edges) {
int a = e.a, b = e.b, current = e.c, lca = e.lca, m1=0, m2=0;
if(current!=0&&path[a].size()%2!=path[b].size()%2) continue;
//cout << a << " " << b << " " << current << " " << lca << " " << m1 << " " << m2 << endl;
while(a!=lca) {
current+=dp[a][m1];
m1=parent[a].second;
a=parent[a].first;
//cout << "a " << a << endl;
}
while(b!=lca) {
current+=dp[b][m2];
m2=parent[b].second;
b=parent[b].first;
//if(b!=0)
//cout << "b " << b << endl;
}
//cout << "line 129" << endl;
m1|=m2;
for(int i = (1<<lvl[lca])-1; i >= 0; i--) {
if(m1&i) continue;
dp[lca][i]=max(dp[lca][i], current+dp[lca][i|m1]);
}
/*
cout << "just did: " << e.a << " " << e.b << " " << e.c << " " << e.lca << " " << m1 << endl;
for(int i = 0; i < 5; i++) {
cout << i << " " << dp[i][0] << " " << dp[i][1] << endl;
}
*/
}
cout << total-dp[0][0] << endl;
}
Compilation message (stderr)
training.cpp: In function 'int main()':
training.cpp:82:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
82 | for(int j = 0; j < edges.size(); j++) {
| ~~^~~~~~~~~~~~~~
training.cpp:85:26: warning: comparison of integer expressions of different signedness: 'int' and 'const long unsigned int' [-Wsign-compare]
85 | for(int i = 1; i < min(path[e.a].size(), path[e.b].size()); i++) {
| ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |