hdu 5102 The K-th Distance (队列+生成法,,)

题意:

N个点的一棵树。定义点u和点v的距离等于它们之间的路径(唯一的)的长度。这样我们可以得到n*(n-1)/2个距离。

将它们从小到大排序,问前K个数的和是多少。

思路:

将边长为1的树枝都入队列。每次取出一个,然后从这根树枝的前端生出一个新点,变成距离加1的一根新树枝,将其入队列。如此操作下去。

可得到所有的各种长度的树枝。因为每根树枝其实有两个在队列里(互为方向生长),故求前2*K个数的和,然后除以2。

*:我们取前队列里的前2K个,就算后面的若干些不是一对一对的,也一定可以取2K个以后的一些数与这2K个数的一些交换,将2K个数调整为一对一对的形式。(画个样例想想就明白了)

例子:

1-2-3          树枝: (1->2),(2->1),(2->3),(3->2),(1->2->3),(3->2->1)

代码:(*:生成够2K个数就可以及时退出了,不然TLE)

struct node{
    int u,v,len;
}edge[2000100];

vector<int> graph[100100];

int T,n,k;

int main(){
    cin>>T;
    while(T--){
        scanf("%d%d",&n,&k);
        int c=0;
        rep(i,1,n) graph[i].clear();
        rep(i,1,n-1){
            int x,y;
            scanf("%d%d",&x,&y);
            graph[x].push_back(y);
            graph[y].push_back(x);
            edge[++c].u=x, edge[c].v=y, edge[c].len=1;
            edge[++c].v=x, edge[c].u=y, edge[c].len=1;
        }
        int p=0;
        while(p<=c){
            if(c>=2*k) break;
            ++p;
            int U=edge[p].u, V=edge[p].v;
            int L=graph[U].size();
            rep(i,0,L-1) if(graph[U][i]!=V && c<2*k){
                ++c;
                edge[c].u=graph[U][i];
                edge[c].v=U;
                edge[c].len=edge[p].len+1;
            }
        }
        ll ans=0;
        int ts=min(c,2*k);
        rep(i,1,ts) ans+=(ll)edge[i].len;
        printf("%I64d\n",ans/2);
    }
}
时间: 2024-10-08 20:13:15

hdu 5102 The K-th Distance (队列+生成法,,)的相关文章

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

hdu 2102 A计划 (bfs+队列)

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9360    Accepted Submission(s): 2265 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.

HDU 5102 The K-th Distance(模拟)

题意:输入一棵树,输出前k小的点对最短距离dis(i,j)的和. 模拟,官方题解说得很清楚了.不重复了. http://bestcoder.hdu.edu.cn/ 需要注意的是,复杂度要O(n+k),不能用set,map之类的标记是否访问. 一开始TLE了,去掉标记后wa了.最后发现对队列的元素加个前缀,就可以了,即标记该条边是从哪个点延伸的. #include <cstdio> #include <cstring> #include <iostream> #inclu

hdu 5102 The K-th Distance

The K-th Distance Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 27    Accepted Submission(s): 5 Problem Description Given a tree, which has n node in total. Define the distance between two nod

HDU 5102 树分治

The K-th Distance Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 202    Accepted Submission(s): 50 Problem Description Given a tree, which has n node in total. Define the distance between two

hdu 1873 看病要排队(优先级队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题目大意: 三个医生看病,病人排队看病,病人有优先级,优先级高的提前看病,同样的优先级按先后.IN A B : A医生有B病人.OUT  A:A医生看完病人.输入看完病的病人是第几个来的.如果当前的医生没有看病人,输出“EMPYT”. 解题思路: 三个医生队列(优先队列:可以自动排序,解决了优先级问题),定义一个病人结构体,记录病人的顺序 key 和优先级priority,如果当前病人看1号医

HDU 5380 Travel with candy 单调队列

链接 题解链接:http://www.cygmasot.com/index.php/2015/08/16/hdu_5380 题意: n C 一条数轴上有n+1个加油站,起点在0,终点在n.车的油箱容量为C 下面n个数字表示每个加油站距离起点的距离. 下面n+1行表示每个加油站买进和卖出一单位油的价格.油可以买也可以卖. 问开到终点的最小花费. 思路: 把油箱保持装满,然后维护一个价格单调递增的队列. #pragma comment(linker, "/STACK:1024000000,10240

HDU 4286 Data Handler (双端队列)

Data Handler Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2455    Accepted Submission(s): 616 Problem Description You are in charge of data in a company, so you are called "Data Handler&qu

HDU Non-negative Partial Sums (单调队列)

Problem Description You are given a sequence of n numbers a0,..., an-1. A cyclic shift by k positions (0<=k<=n-1) results in the following sequence: ak ak+1,..., an-1, a0, a1,..., ak-1. How many of the n cyclic shifts satisfy the condition that the