Submission #1030543

#TimeUsernameProblemLanguageResultExecution timeMemory
1030543MMihalevTraining (IOI07_training)C++14
0 / 100
8 ms6236 KiB
#include<iostream> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> #include<vector> #include<queue> #include<stack> #include<tuple> #include<set> #include<map> #include<random> #include<chrono> #include<array> #include<unordered_map> using namespace std; const int MAX_N=1e3+3; const int MAX_M=5e3+3; const int MASK=(1<<10); const int LOG=10; int calc[MAX_N][MAX_N]; int dp[MAX_N][MASK]; int idx[MAX_M]; int pointspath[MAX_M][2][2]; int cost[MAX_M]; vector<int>edges[MAX_N]; vector<int>g[MAX_N]; int par[MAX_N][LOG]; int endss[MAX_M][2]; int in[MAX_N]; int out[MAX_N]; int ver[MAX_N]; int d[MAX_N]; int T; int n,m; int sumedges; void dfs(int u) { in[u]=++T; ver[T]=u; int sz=0; for(int v:g[u]) { if(v==par[u][0])continue; par[v][0]=u; d[v]=d[u]+1; idx[v]=sz++; dfs(v); } out[u]=T; } int lca(int u,int v) { if(d[u]>d[v])swap(u,v); for(int j=LOG-1;j>=0;j--) { if(d[v]-(1<<j)>=d[u]) { v=par[v][j]; } } if(u==v)return u; for(int j=LOG-1;j>=0;j--) { if(par[v][j]!=par[u][j]) { v=par[v][j]; u=par[u][j]; } } return par[u][0]; } void precompute() { dfs(1); for(int j=1;j<LOG;j++) { for(int i=1;i<=n;i++) { par[i][j]=par[par[i][j-1]][j-1]; } } for(int i=1;i<=m;i++) { if(!cost[i])continue; int u=endss[i][0],v=endss[i][1]; int LCA=lca(u,v); if((d[u]+d[v]-2*d[LCA])%2==1)continue; edges[LCA].push_back(i); pointspath[i][0][0]=u; while(u!=LCA && par[u][0]!=LCA)u=par[u][0]; pointspath[i][0][1]=u; pointspath[i][1][0]=v; while(v!=LCA && par[v][0]!=LCA)v=par[v][0]; pointspath[i][1][1]=v; } } void read() { cin>>n>>m; for(int i=1;i<=m;i++) { int u,v,c; cin>>u>>v>>c; sumedges+=c; cost[i]=c; if(c==0) { g[u].push_back(v); g[v].push_back(u); } else { endss[i][0]=u; endss[i][1]=v; } } } void DFS(int u) { for(int v:g[u]) { if(v==par[u][0])continue; DFS(v); } int sz=g[u].size()-(par[u][0]!=0); for(int mask=1;mask<(1<<sz);mask++) { for(int edge:edges[u]) { int cur=0,nmask=mask; bool val=1; for(int f=0;f<2;f++) { if(pointspath[edge][f][1]!=u) { if(((1<<idx[pointspath[edge][f][1]])&mask)==0)val=0; nmask&= ~(1<<idx[pointspath[edge][f][1]]); } cur+=calc[pointspath[edge][f][0]][pointspath[edge][f][1]]; } cur+=dp[u][nmask]; if(val)dp[u][mask]=max(dp[u][mask],cur+cost[edge]); } } for(int v:g[u]) { if(v==par[u][0])continue; for(int pos=in[v];pos<=out[v];pos++) { int vert=ver[pos]; calc[vert][u]=calc[vert][v]+dp[u][((1<<sz)-1) & ~(1<<idx[v])]; } } calc[u][u]=dp[u][(1<<sz)-1]; } void solve() { DFS(1); int ans=sumedges-dp[1][(1<<(g[1].size()))-1]; cout<<ans<<"\n"; } signed main () { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); read(); precompute(); solve(); return 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...