Submission #468053

#TimeUsernameProblemLanguageResultExecution timeMemory
468053starplatRace (IOI11_race)C++14
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define f first
#define s second
#define pll pair<ll,ll>
using namespace std;
ll n,k,u,v,w,freq[10000005],ans;
ll marked[200005],ctree[200005],tree[200005];
vector<pll> g[200005];
void subtree(int x,int p)//subtree size
{
	if (marked[x]) return;
	tree[x]=1;
	for (pll i:g[x]){
		if (p!=i.f&&!marked[i.f]){
			subtree(i.f,x);
			tree[x]+=tree[i.f];
		}
	}
}
int find(int x,int ct,int p)
{
	for (pll i:g[x]){
		if (i.f!=p){
			if (!marked[i.f] && tree[i.f]>ct/2) return find(i.f,ct,x);
		}
	}
	return x;
}
void dfs(int x,int p,ll dist,ll lvl)
{
	if (dist>k) return;
	ans=min(ans,lvl+freq[k-dist]);
	//cout<<"dfs "<<x<<" "<<p<<" "<<dist<<" "<<lvl<<" "<<freq[k-dist]<<" "<<ans<<"\n";
	if (dist==k) ans=min(ans,lvl);
	for (pll i:g[x]){
		if (i.f!=p &&!marked[i.f]){
			dfs(i.f,x,dist+i.s,lvl+1);
		}
	}
}
void dfs1(int x,int p,ll dist,ll lvl)
{
	if (dist>k) return;
	freq[dist]=min(lvl,freq[dist]);
	//cout<<"dfs1"<<" "<<x<<" "<<p<<" "<<dist<<" "<<lvl<<" "<<freq[dist]<<"\n";
	if (dist==k) ans=min(ans,lvl);
	for (pll i:g[x]){
		if (!marked[i.f]&&i.f!=p){
			dfs1(i.f,x,dist+i.s,lvl+1);
		}
	}
}
void subtreeclear(int x,int p,ll dist)
{
	if (dist>k) return;
	freq[dist]=INT_MAX;
	for (pll i:g[x]){
		if (!marked[i.f]&&i.f!=p){
			subtreeclear(i.f,x,dist+i.s);
		}
	}
}
int build(int x)
{
	subtree(x,-1);
	int node=find(x,tree[x],-1);
	//cout<<node<<"\n";
	marked[node]=1;
	freq[0]=INT_MAX;
	for (pll i:g[node]){
	    if (!marked[i.f]){
	        dfs(i.f,node,i.s,1);
	        dfs1(i.f,node,i.s,1);
	    }
	}
	subtreeclear(node,-1,0);
	for (pll i:g[node]){
		if (!marked[i.f]){
			ctree[build(i.f)]=node;
		}
	}
	return node;
}
int main()
{
	cin>>n>>k;
	for (int i=1;i<n;i++){
		cin>>u>>v>>w;
		g[u].pb({v,w});
		g[v].pb({u,w});
	}
	ans=INT_MAX;
	for (int i=0;i<=1e7;i++) freq[i]=INT_MAX; 
	int root=build(0);
	if (ans==INT_MAX) cout<<-1<<endl;
	else cout<<ans<<endl;
	return 0;
}
/*
properties
1.a vertex belongs to the component of all its ancestors
2.the path from a to b can be decomposed into the path fom a to lca(a,b) and the path from lca(a,b) , 
  where lca(a,b) is the lowest common ancestor of a and b in the centroid decomposition
3.the height of the centroid tree is O(log2(n))
*/
/*
11 5
0 1 3
0 2 4
2 3 5
3 4 4
4 5 6
0 6 3
6 7 2
6 8 5
8 9 6
8 10 7
1
*/

Compilation message (stderr)

race.cpp: In function 'int main()':
race.cpp:96:6: warning: unused variable 'root' [-Wunused-variable]
   96 |  int root=build(0);
      |      ^~~~
/usr/bin/ld: /tmp/ccg29giY.o: in function `main':
race.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccS4z0RY.o:grader.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccS4z0RY.o: in function `main':
grader.cpp:(.text.startup+0x28): undefined reference to `best_path(int, int, int (*) [2], int*)'
collect2: error: ld returned 1 exit status