HDU 5102 The K-th Distance(模拟)
题意:输入一棵树,输出前k小的点对最短距离dis(i,j)的和。
模拟,官方题解说得很清楚了。不重复了。
需要注意的是,复杂度要O(n+k),不能用set,map之类的标记是否访问。
一开始TLE了,去掉标记后wa了。最后发现对队列的元素加个前缀,就可以了,即标记该条边是从哪个点延伸的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <set> #include <queue> #include <map> using namespace std; #define ll long long #define MP make_pair #define inf 1e9 #define eps 1e-8 #define maxn 110000 #define maxm 210000 int que[2100000][4]; struct Edge{ int v,nxt; }e[maxm]; int head[maxn],esz; void init(){esz=0; memset (head,-1, sizeof (head));} void addedge( int u, int v){ e[esz].v=v,e[esz].nxt=head[u]; head[u]=esz++; } int main(){ int t; scanf ( "%d" ,&t); while (t--){ int n,m; scanf ( "%d%d" ,&n,&m); m<<=1; int sz=0; init(); for ( int i=1;i<n;++i){ int u,v; scanf ( "%d%d" ,&u,&v); addedge(u,v); addedge(v,u); if (sz<m){ que[sz][0]=u,que[sz][1]=v,que[sz][2]=1; que[sz][3]=-1; ++sz; } if (sz<m){ que[sz][0]=v,que[sz][1]=u,que[sz][2]=1; que[sz][3]=-1; ++sz; } } int H=0,T=sz; ll ans=0; for ( int i=0;i<m;++i){ int dis = que[H][2]; int u = que[H][0], v = que[H][1]; int pre = que[H][3]; ++H; for ( int j=head[u];j!=-1 && T<m;j=e[j].nxt){ int uu = e[j].v; if (uu==v || uu==pre) continue ; que[T][0]=uu,que[T][1]=v,que[T][2]=dis+1; que[T][3]=u; T++; } ans+=dis; } printf ( "%I64d\n" ,ans>>1); } return 0; } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档