제출 #1250527

#제출 시각아이디문제언어결과실행 시간메모리
1250527nrg_studioTraining (IOI07_training)C++20
0 / 100
17 ms4676 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define pii pair<int,int> #define f first #define s second #define chmin(a, b) a = min(a,b) #define chmax(a, b) a = max(a,b) #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define F0R(i, a) for (int i = 0; i < (a); i++) #define all(x) x.begin(),x.end() #define vec vector const int N = 1000, K = 10, MX = (1<<K)-1; vec<int> adj[N]; vec<array<int,3>> todo[N]; int par[N], dep[N], ind[N]; int dp[N][1<<K]; void dfs(int cur=0) { for (int i=0;i<adj[cur].size();i++) { int x = adj[cur][i]; ind[x] = i; par[x] = cur; dep[x] = dep[cur]+1; adj[x].erase(find(adj[x].begin(),adj[x].end(),cur)); dfs(x); } } int cost(const int cur, int targ, int& mask) { int res = dp[targ][MX]; while (par[targ]!=cur) { //if (cur==1 && targ==3) {cout << dp[par[targ]][MX^(1<<ind[targ])]-dp[targ][MX];} res += dp[par[targ]][MX^(1<<ind[targ])]-dp[targ][MX]; targ = par[targ]; } mask |= (1<<ind[targ]); //if (cur==0 && targ==2) {cout<<res<<'\n';} return res; } void upd(const int cur, const int mask, const int c) { for (int i=MX;i>=0;i--) { if (i&mask) {continue;} chmax(dp[cur][mask|i],dp[cur][i]+c); } } void dfs2(int cur=0) { for (int x : adj[cur]) { dfs2(x); } for (int x : adj[cur]) { upd(cur,1<<ind[x],dp[x][MX]); } for (int i=0;i<todo[cur].size();i++) { int a = todo[cur][i][0], b = todo[cur][i][1], c = todo[cur][i][2]; int mask = 0; c += cost(cur,a,mask); if (b!=-1) {c += cost(cur,b,mask);} upd(cur,mask,c); } for (int mask=0;mask<(1<<K);mask++) { for (int b=0;b<K;b++) { chmax(dp[cur][mask|(1<<b)],dp[cur][mask]); } } } int main() { ios::sync_with_stdio(false); cin.tie(0); par[0] = -1; dep[0] = 0; int n, m; cin >> n >> m; vec<array<int,3>> non; for (int i=0;i<m;i++) { int a, b, c; cin >> a >> b >> c; if (c!=0) {non.pb({--a,--b,c});} else { adj[--a].pb(--b); adj[b].pb(a); } } dfs(); int ans = 0; for (int i=0;i<m-(n-1);i++) { int a = non[i][0], b = non[i][1], c = non[i][2]; ans += c; if (dep[a]<dep[b]) {swap(a,b);} int dist = (dep[a]-dep[b])%2; int a2 = a, b2 = b; while (dep[a]!=dep[b]) {a = par[a];} while (par[a]!=par[b]) { a = par[a]; b = par[b]; } if (dist==0) { if (a==b) {todo[b].pb({a2,-1,c});} else {todo[par[a]].pb({a2,b2,c});} } } dfs2(); //cout << dp[2][MX^(1<<ind[4])]<<'\n'; //cout<<ans<<'\n'; //for (int i=0;i<n;i++) {cout<<dp[i][MX]<<' ';} ans -= dp[0][MX]; cout << ans << '\n'; }
#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...