#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin >> n >> m;
vector<vector<int>> adj(n);
vector<vector<int>> edges;
int sum = 0;
for(int i=0;i<m;i++){
int a,b,c;
cin >> a >> b >> c;
a--;
b--;
if(c==0){
adj[a].push_back(b);
adj[b].push_back(a);
}
else{
edges.push_back({a,b,c});
sum += c;
}
}
vector<int> q = {0};
vector<int> parent(n,0);
vector<int> dist(n,0);
for(int index=0;index<n;index++){
int i = q[index];
for(int j:adj[i]){
if(j!=parent[i]){
parent[j] = i;
dist[j] = dist[i]+1;
q.push_back(j);
}
}
}
vector<vector<int>> lift(n);
for(int i=0;i<n;i++){
lift[i].push_back(parent[i]);
}
for(int j=1;j<20;j++){
for(int i=0;i<n;i++){
lift[i].push_back(lift[lift[i][j-1]][j-1]);
}
}
vector<vector<int>> dp(n);
for(int i=0;i<n;i++){
for(int j=0;j<(1<<adj[i].size());j++){
dp[i].push_back(0);
}
}
vector<vector<vector<int>>> e(n);
for(int i=0;i<edges.size();i++){
int x = edges[i][0];
int y = edges[i][1];
if(dist[x]<dist[y]){
swap(x,y);
}
for(int j=19;j>=0;j--){
if(dist[x]-(1<<j)>dist[y]){
x = lift[x][j];
}
}
if(parent[x]!=y){
if(dist[x]>dist[y]){
x = parent[x];
}
for(int j=19;j>=0;j--){
if(lift[x][j]!=lift[y][j]){
x = lift[x][j];
y = lift[y][j];
}
}
int z = parent[x];
e[z].push_back({i,x,y});
}
else{
int z = parent[x];
e[z].push_back({i,x});
}
}
vector<vector<int>> adj1(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
adj1[i].push_back(-1);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<adj[i].size();j++){
adj1[i][adj[i][j]] = j;
}
}
for(int a=n-1;a>=0;a--){
int i = q[a];
for(int j=0;j<(1<<adj[i].size());j++){
for(int k=0;k<adj[i].size();k++){
if((j&(1<<k))==0){
dp[i][j] += dp[adj[i][k]][0];
}
}
}
for(auto z:e[i]){
int s = edges[z[0]][2];
if(z.size()==3){
int x = edges[z[0]][0];
int y = edges[z[0]][1];
s += dp[x][0];
s += dp[y][0];
while(parent[x]!=i){
s += dp[parent[x]][1<<adj1[parent[x]][x]];
x = parent[x];
}
while(parent[y]!=i){
s += dp[parent[y]][1<<adj1[parent[y]][y]];
y = parent[y];
}
}
for(int j=0;j<(1<<adj[i].size());j++){
int f = 1;
int k = 0;
if(z.size()==3){
if((j&(1<<adj1[i][z[2]]))){
f = 0;
}
k += 1<<adj1[i][z[2]];
}
if((j&(1<<adj1[i][z[1]]))){
f = 0;
}
k += 1<<adj1[i][z[1]];
if(f){
dp[i][j] = max(dp[i][j],s+dp[i][j+k]);
}
}
}
}
cout << sum-dp[0][0] << endl;
}
| # | 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... |