如何自己做资源类网站,企业运营数据分析报告,一站式网站建设公司,企业网站建设机构正题
题目链接:https://www.luogu.com.cn/problem/P4149 题目大意 nnn个点的一棵树#xff0c;求一条边最少的权值和为kkk的路径。 解题思路
直接点分治#xff0c;然后用mapmapmap记录每个权值和的最小边数转移即可。 时间复杂度O(nlog2n)O(n\log^2 n)O(nlog2n) codecod…正题
题目链接:https://www.luogu.com.cn/problem/P4149 题目大意
nnn个点的一棵树求一条边最少的权值和为kkk的路径。 解题思路
直接点分治然后用mapmapmap记录每个权值和的最小边数转移即可。 时间复杂度O(nlog2n)O(n\log^2 n)O(nlog2n) codecodecode
#includecstdio
#includecstring
#includealgorithm
#includemap
using namespace std;
const int N2e510;
struct node{int to,next,w;
}a[N*2];
int n,k,ls[N],f[N],siz[N],sum,root,ans,tot;
bool v[N];
mapint,int mp;
void groot(int x,int fa){if(v[x])return;siz[x]1;f[x]0;for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa||v[y])continue;groot(y,x);siz[x]siz[y];f[x]max(f[x],siz[y]);}f[x]max(f[x],sum-siz[x]);if(f[x]f[root])rootx;
}
void ret(int x,int fa,int dep,int w){if(v[x])return;if(wk)return;if(mp.count(k-w))ansmin(ans,mp[k-w]dep);for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa||v[y])continue;ret(y,x,dep1,wa[i].w);}return;
}
void dfs(int x,int fa,int dep,int w){if(v[x])return;if(depans||wk)return;if(wk){ansmin(ans,dep);return;}if(!mp.count(w))mp[w]dep;else mp[w]min(mp[w],dep);for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa||v[y])continue;dfs(y,x,dep1,wa[i].w);}return;
}
void calc(int x){mp.clear(); for(int ils[x];i;ia[i].next){int ya[i].to;ret(y,x,1,a[i].w);dfs(y,x,1,a[i].w);}return;
}
void solve(int x){v[x]1;calc(x);for(int ils[x];i;ia[i].next){int ya[i].to;sumsiz[y];rootn;groot(y,x);solve(root);}
}
void addl(int x,int y,int w){a[tot].toy;a[tot].nextls[x];ls[x]tot;a[tot].ww;return;
}
int main()
{scanf(%d%d,n,k);ans2147483647; for(int i1;in;i){int x,y,w;scanf(%d%d%d,x,y,w);addl(x,y,w);addl(y,x,w);}sumrootn;f[n]2147483647;groot(0,0);solve(root);if(ans2147483647)printf(-1);else printf(%d,ans);
}