Submission #1302183

#TimeUsernameProblemLanguageResultExecution timeMemory
1302183bronze_coderTraining (IOI07_training)C++20
100 / 100
14 ms5472 KiB
#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])&1){ continue; } 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]; } } else{ int x = edges[z[0]][0]; int y = edges[z[0]][1]; if(dist[x]<dist[y]){ swap(x,y); } s += dp[x][0]; while(parent[x]!=i){ s += dp[parent[x]][1<<adj1[parent[x]][x]]; x = parent[x]; } } 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 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...