HDU 5102 The K-th Distance
题意:给你n-1条边,然后没两个节点的距离按照递增的顺序,求出前k项的和。
官方题解:
把所有边(u,v) 以及(v,u)放入一个队列,队列每弹出一个元素(u,v),对于所有与u相邻的点w,如果w!=v,就把(w,u)入队。这样就能一个一个生成前K小的距离。 注意到每条边实际上会入队两次,只要把K翻倍且把ans除2即可,时间复杂度为O(n+K);
这里只是实现一下而已。
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define N 100007 struct node
{
int u,v,d;
node(int _u,int _v,int _d):u(_u),v(_v),d(_d){}
node(){}
};
struct Edge{
int v,next;
}G[*N];
int ans,k,tot,head[N];
queue<node> q; void addedge(int u,int v)
{
G[tot].v = v;
G[tot].next = head[u];
head[u] = tot++;
} void bfs()
{
int cnt = ;
while(!q.empty())
{
node tmp = q.front();
q.pop();
int u = tmp.u, v = tmp.v, d = tmp.d;
if(cnt >= k) break;
for(int i=head[u];i!=-;i=G[i].next)
{
int vv = G[i].v;
if(vv != v)
{
ans += d+;
cnt++;
q.push(node(vv,u,d+));
}
if(cnt >= k) break;
}
if(cnt >= k) break;
}
} int main()
{
int t,n,u,v,i;
scanf("%d",&t);
while(t--)
{
while(!q.empty()) q.pop();
scanf("%d%d",&n,&k);
tot = ;
memset(head,-,sizeof(head));
for(i=;i<=n;i++) q.push(node(i,i,));
for(i=;i<n;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
k *= ;
ans = ;
bfs();
cout<<ans/<<endl;
}
return ;
}
HDU 5102 The K-th Distance的更多相关文章
- hdu 5102 树上前k短路径长度和
http://acm.hdu.edu.cn/showproblem.php?pid=5102 给一棵树,求出所有节点的距离中前k小的路径长度和 由于路径长度的定义为两点之间的边的个数,所有遍历1~n- ...
- HDU 5102 The K-th Distance(模拟)
题意:输入一棵树,输出前k小的点对最短距离dis(i,j)的和. 模拟,官方题解说得很清楚了.不重复了. http://bestcoder.hdu.edu.cn/ 需要注意的是,复杂度要O(n+k), ...
- hdu 5102 The K-th Distance (队列+生成法,,)
题意: N个点的一棵树.定义点u和点v的距离等于它们之间的路径(唯一的)的长度.这样我们可以得到n*(n-1)/2个距离. 将它们从小到大排序,问前K个数的和是多少. 思路: 将边长为1的树枝都入队列 ...
- hdu 2639 第k大01背包
求每个状态里的k优解,然后合并 /* HDU 2639 求01背包的第k大解. 合并两个有序序列 */ #include<stdio.h> #include<iostream> ...
- HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...
- hdu 5102(巧妙的搜索)
The K-th Distance Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- K Edit Distance
Description Given a set of strings which just has lower case letters and a target string, output all ...
- HDU 6181 第k短路
Two Paths Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others)Total ...
- hdu 4006 第K大的数(优先队列)
N次操作 I是插入一个数 Q是输出第K大的数 Sample Input8 3 //n kI 1I 2I 3QI 5QI 4Q Sample Output123 # include <iostre ...
随机推荐
- 不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事
阿袁工作的第1天: 不变(Invariant), 协变(Covarinat), 逆变(Contravariant)的初次约 阿袁,早!开始工作吧. 阿袁在笔记上写下今天工作清单: 实现一个scala类 ...
- spring编程式刷新/重新加载applicationcontext/dispatchservlet(正确版)
有些时候,尤其是在开发应用框架的时候,由于某些原因无法或者很难重启tomcat或者reload应用,但是配置又需要动态生效,这个时候通常希望通过reload spring applicationcon ...
- Play常用代码片段 http://www.anool.net/?p=625
持续更新中: (1)按照降序查询: List<Entity> entities= Entity.find("order by id desc").fetch(2); ...
- Error writing file‘frm‘(Errcode: 28)
Error writing file‘frm‘(Errcode: 28) mysql出现这个错误,表示磁盘已经满了,该增加容量了.
- SharePoint 2013 新功能探索 之 SPGroup、SPUser 事件处理程序 还要继续改进
曾几何时,想要获取SPGroup Add及SPUserAdd事件,在网上查找各种方法,都没有找到相对应的解决办法,如今在VS 2013 Preview版本 提供了 SPSecurityEventRec ...
- 用js枚举实现简易菜单效果
用js枚举实现简易菜单效果,左侧显示菜单,右侧显示用户选择的菜单,一图胜千言,还是直接来张效果图吧: 以下是代码: <DOCTYPE html> <html> <head ...
- angularjs 的ng-bind-html过滤了内容的style
1.不使用ng-bind-html,使用trustAs() trustAsHtml(value) = trustAs($sce.HTML, value) trustAsJs(value) = ...
- android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- 【读书笔记】iOS网络-HTTP-URL百分号编码
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ty ...
- IOS 网络浅析-(十 NSURLSession下载简介)
之前本来打算在写两个篇幅,但是在这片开写的时候觉得还是写一个比较好,有利于理解.NSURLSession下载是通过NSURLSession下载代理实现的,上一片也介绍了代理,之所以没有介绍下载是因为, ...