IOI2011 Race
程序员文章站
2022-05-12 15:54:13
...
Description
给一棵有N(1 <= N <= 200000)个结点的树,每条边有权,求一条路径,权值和等于K(1 <= K <= 1000000)且边的数量最小。
Input
第一行两个整数 n, k
第2到n行每行三个整数,表示一条无向边的两端和权值 (注意点的编号从0开始)
Output
输出仅一个整数,表示最小边数量,如果不存在这样的路径,则输出-1
Sample Input
4 3
0 1 1
1 2 2
1 3 4
Sample Output
2
#include<bits/stdc++.h>
using namespace std;
const int Maxn=200005;
struct Edge{
int cnt,h[Maxn],w[Maxn*2],to[Maxn*2],next[Maxn*2];
inline void add(int x,int y,int z){
next[++cnt]=h[x];to[cnt]=y;w[cnt]=z;h[x]=cnt;
}
}e;
struct Node{
int v,num;
bool operator <(const Node&A) const {
return v<A.v||v==A.v&&num<A.num;
}
}q[Maxn];set<Node>s;
#define to e.to[p]
int cnt,ans=1<<30;
int tmpsiz[Maxn];
bool vst[Maxn];
inline void stat(int x,int fa,int num,int dist){
q[++cnt]=(Node){dist,num};
for(int p=e.h[x];p;p=e.next[p])
if(!vst[to]&&(to^fa))stat(to,x,num+1,dist+e.w[p]);
}
inline void work(int x,int goal){
s.clear();
for(int p=e.h[x];p;p=e.next[p])if(!vst[to]){
cnt=0;stat(to,x,1,e.w[p]);
for(int i=1;i<=cnt;++i){
Node nd=*s.lower_bound((Node){goal-q[i].v,0});
if(nd.v+q[i].v==goal&&s.count(nd))ans=min(ans,nd.num+q[i].num);
}
for(int i=1;i<=cnt;++i)s.insert(q[i]);
}
Node nd=*s.lower_bound((Node){goal,0});
if(nd.v==goal&&s.count(nd))ans=min(ans,nd.num);
}
inline void getroot(int x,int fa,int &mn,int &root,int totsiz){
tmpsiz[x]=1;int maxsiz=0;
for(int p=e.h[x];p;p=e.next[p])if(!vst[to]&&(to^fa)){
getroot(to,x,mn,root,totsiz);
tmpsiz[x]+=tmpsiz[to];
maxsiz=max(maxsiz,tmpsiz[to]);
}
maxsiz=max(maxsiz,totsiz-tmpsiz[x]);
if(maxsiz<mn)mn=maxsiz,root=x;
}
inline void Divide(int x,int goal,int totsiz){
int mn=1<<30,root=x;
getroot(x,0,mn,root,totsiz);
work(root,goal);
vst[root]=1;
for(int p=e.h[root];p;p=e.next[p])
if(!vst[to])Divide(to,goal,tmpsiz[to]);
}
int main(){
int n,k;scanf("%d%d",&n,&k);
for(int i=1;i<n;++i){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
e.add(x+1,y+1,z),e.add(y+1,x+1,z);
}
Divide(1,k,n);
printf("%d\n",ans==1<<30?-1:ans);
return 0;
}
上一篇: Go语言学习
下一篇: Oracle对字符串排序问题解决
推荐阅读
-
全球首款125W骁龙888旗舰!曝realme Race正式命名为“真我 GT”
-
不止125W快充!曝realme Race Pro将搭载2K+160Hz超高刷屏幕
-
realme Race预热:或首发125W闪充 春节后登场
-
全球首发125W快充!realme徐起:Race系列将成为新的旗舰标杆
-
realme宋琪一个字点评realme Race新旗舰:犇
-
Promise的三兄弟:all(), race()以及allSettled()
-
realme Race获认证:或支持125W超快闪充
-
业内首款2K+160Hz超高刷屏幕!realme Race确认三月发布
-
首批搭载骁龙888 realme宋琪:realme Race将一鸣惊人
-
对标红米K40?realme Race曝光:骁龙888+125W快充