Submission #1319048

#TimeUsernameProblemLanguageResultExecution timeMemory
1319048aryanFirefighting (NOI20_firefighting)C++20
14 / 100
99 ms18272 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n,k; cin >> n >> k; vector<vector<pair<int,int>>> adj(n); for(int i = 0;i < n - 1;i++){ int u,v,w; cin >> u >> v >> w; u --; v --; adj[u].push_back({v,w}); adj[v].push_back({u,w}); } assert(n <= 17); const i64 inf = 1e18; vector<bool> is(n,false); vector<i64> sub(n,inf); function<void(int,int)> dfs1 = [&](int u,int p){ if(is[u]) sub[u] = 0LL; for(auto pa : adj[u]){ int v = pa.first; int w = pa.second; if(v == p) continue; dfs1(v,u); sub[u] = min(sub[u],sub[v] + w); } }; vector<i64> dp(n,inf); function<void(int,int,i64)> dfs2 = [&](int u,int p,i64 mini){ dp[u] = min(mini,sub[u]); for(auto pa : adj[u]){ int v = pa.first; int w = pa.second; if(v == p) continue; dfs2(v,u,min(mini,sub[u]) + w); } }; int best = (1 << n) - 1; for(int i = 0;i < (1 << n);i++){ for(int j = 0;j < n;j++){ if(i & (1 << j)){ is[j] = true; }else{ is[j] = false; } sub[j] = dp[j] = inf; } dfs1(0,0); dfs2(0,0,inf); bool ok = true; for(int j = 0;j < n;j++){ if(dp[j] > (i64)k){ ok = false; break; } } if(ok && __builtin_popcount(i) < __builtin_popcount(best)){ best = i; } } cout << __builtin_popcount(best) << '\n'; for(int i = 0;i < n;i++){ if((1 << i) & best){ cout << i + 1 << " "; } } cout << '\n'; 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...