# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
563032 | Devigo | Road Closures (APIO21_roads) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int siz = 1e5+1;
bool done = 0;
long long cost = 0;
vector<bool> rem(siz,0);
struct edge {
long long w, x, y;
};
bool cmp (edge a, edge b) {
return a.w < b.w;
}
void get(int k, vector<int> °ree, vector<edge> &el, int n, int m) {
for(int i=0; i<m; i++) {
if(rem[i]) continue;
bool isb = 0;
int u = degree[el[i].x]; int v = degree[el[i].y];
if(u > k || v > k) isb = 1;
if(isb) {
degree[el[i].x]--; degree[el[i].y]--;
rem[i] = 1;
cost += el[i].w;
}
int grt = -1;
for(int j=0; j<n; j++) {
grt = max(grt,degree[j]);
}
if(grt <= k) {
done = 1; return;
}
}
return;
}
long long[] minimum_closure_costs(int n, int u[], int v[], int w[]) {
vector<int> degree(n,0);
vector<edge> el;
int m = n-1;
for(int i=0; i<m; i++) {
degree[u[i]]++;
degree[v[i]]++;
el.push_back({w[i],u[i],v[i]});
}
sort(el.begin(), el.end(), cmp);
long long c[n];
for(int i=m; i>=0; i--) {
while(!done) {
get(i,degree,el,n,m);
}
c[i] = cost;
done = 0;
}
return c;
}