社区讨论
TLE75pts
P4149[IOI 2011] Race参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mk9pvofd
- 此快照首次捕获于
- 2026/01/11 20:35 上个月
- 此快照最后确认于
- 2026/01/11 20:47 上个月
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int f=1,x=0;
char s=getchar();
while(s<'0'||s>'9'){
if(s=='-') f=-1;
s=getchar();
}
while(s>='0'&&s<='9'){
x=(x<<1)+(x<<3)+(s^48);
s=getchar();
}
return x*f;
}
const int N=1e6+5;
int n,k,ans=1e9,tot;
int cnt;
int to[N],we[N],nxt[N],hd[N];
void Add(int u,int v,int w){
to[++cnt]=v;
we[cnt]=w;
nxt[cnt]=hd[u];
hd[u]=cnt;
}
int rt;
int siz[N];
bool vis[N];
void DfsRt(int u,int fa){
siz[u]=1;
int mx=0;
for(int i=hd[u];i;i=nxt[i]){
if(to[i]==fa||vis[to[i]]) continue;
DfsRt(to[i],u);
siz[u]+=siz[to[i]];
mx=max(mx,siz[to[i]]);
}
mx=max(mx,tot-siz[u]);
if(mx*2<=n) rt=u;
}
int dp[N];
int cntd;
int dis1[N],dis2[N];
void GetDis(int u,int fa,int d1,int d2){
if(d1>k) return;
dis1[++cntd]=d1;
dis2[cntd]=d2;
for(int i=hd[u];i;i=nxt[i]){
if(to[i]==fa||vis[to[i]]) continue;
GetDis(to[i],u,d1+we[i],d2+1);
}
}
void Dp(int u){
dp[0]=0; cntd=0;
for(int i=hd[u];i;i=nxt[i]){
if(vis[to[i]]) continue;
int resd=cntd;
GetDis(to[i],u,we[i],1);
for(int i=resd+1;i<=cntd;i++)
ans=min(ans,dp[k-dis1[i]]+dis2[i]);
for(int i=resd+1;i<=cntd;i++)
dp[dis1[i]]=min(dp[dis1[i]],dis2[i]);
}
for(int i=1;i<=cntd;i++) dp[dis1[i]]=1e9;
}
void Work(int u){
vis[u]=1;
Dp(u);
for(int i=hd[u];i;i=nxt[i]){
if(vis[to[i]]) continue;
tot=siz[to[i]];
rt=0;
DfsRt(to[i],u);
Work(rt);
}
}
int main(){
n=read(); k=read();
for(int i=1;i<n;i++){
int u=read()+1,v=read()+1,w=read();
Add(u,v,w);
Add(v,u,w);
}
tot=n;
DfsRt(1,0);
memset(dp,0x3f,sizeof dp);
Work(rt);
if(ans>=n) cout<<-1;
else cout<<ans;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...