Submission #434198

#TimeUsernameProblemLanguageResultExecution timeMemory
434198dqhungdl도로 폐쇄 (APIO21_roads)C++17
24 / 100
2089 ms20192 KiB
#include "roads.h"

#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> ii;
const int MAX=1e5+5;
const long long INF=1e18;
vector<long long> f0,f1; // f0: do not need to close parent edge, f1: force to close parent edge (f0[u] >= f1[u])
vector<ii> g[MAX];

void dfs(int u,int p,int atMost) {
	long long sum=0,minSum=0;
	for(ii edge:g[u]) {
		int v=edge.first,w=edge.second;
		if(v==p)
			continue;
		dfs(v,u,atMost);
		sum+=f0[v];
		minSum+=min(f0[v],f1[v]+w);
	}
	int eraseNum=(int)g[u].size()-atMost;
	if(eraseNum<=0) {
		f0[u]=f1[u]=minSum;
		return;
	}
	vector<long long> gaps;
	for(ii edge:g[u]) {
		int v=edge.first,w=edge.second;
		if(v==p)
			continue;
		// Cost for switching from 0 to 1
		gaps.push_back(f1[v]+w-f0[v]);
	}
	sort(gaps.begin(),gaps.end());
	// Iterate number of erase edges
	if(eraseNum==1)
		f1[u]=sum;
	long long sumGap=0;
	for(int i=0;i<gaps.size();i++) {
		sumGap+=gaps[i];
		if(i+2>=eraseNum)
			f1[u]=min(f1[u],sum+sumGap);
		if(i+1>=eraseNum)
			f0[u]=min(f0[u],sum+sumGap);
	}
}

std::vector<long long> minimum_closure_costs(int N, 
											 std::vector<int> U,
                                             std::vector<int> V,
                                             std::vector<int> W) {
	for(int i=0;i<N-1;i++) {
		g[U[i]].push_back({V[i],W[i]});
		g[V[i]].push_back({U[i],W[i]});
	}
	vector<long long> rs;
	for(int i=0;i<N;i++) {
		f0.resize(N,INF);
		f1.resize(N,INF);
		dfs(0,0,i);
		//for(int j=0;j<N;j++)
		//	cerr<<j<<": "<<f0[j]<<' '<<f1[j]<<'\n';
		rs.push_back(f0[0]);
	}
	return rs;
}

Compilation message (stderr)

roads.cpp: In function 'void dfs(int, int, int)':
roads.cpp:40:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |  for(int i=0;i<gaps.size();i++) {
      |              ~^~~~~~~~~~~~
#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...