hdu5102 单位边权树上的前k长路径和:队列技巧

单向拓展边orz题解==

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 int next[200005],head[200005],point[200005],now;
 7 void add(int x,int y)
 8 {
 9     next[++now]=head[x];
10     head[x]=now;
11     point[now]=y;
12 }
13 struct dian{
14     int u,v,t;
15 };
16 queue<dian>q;
17 int main()
18 {
19     int T,n,k,i,x,y,cnt,ans,tmp;
20     dian n1,n2;
21     scanf("%d",&T);
22     while (T--)
23     {
24         while (!q.empty()) q.pop();
25         memset(head,-1,sizeof(head));
26         scanf("%d%d",&n,&k);
27         now=0; k*=2;
28         for (i=1;i<n;i++)
29         {
30             scanf("%d%d",&x,&y);
31             add(x,y); add(y,x);
32             n1.u=x; n1.v=y; n1.t=1; q.push(n1);
33             n1.u=y; n1.v=x; n1.t=1; q.push(n1);
34         }
35         cnt=0; ans=0;
36         if (k==0) {printf("0\n"); continue;}
37         while (!q.empty())
38         {
39             n1=q.front(); q.pop();
40             cnt++; ans+=n1.t;
41             if (cnt==k) break;
42             tmp=cnt+q.size();
43             for (i=head[n1.v];i!=-1&&tmp<=k;i=next[i])
44             {
45                 x=point[i];
46                 if (x==n1.u) continue;
47                 n2.u=n1.v; n2.v=x; n2.t=n1.t+1;
48                 q.push(n2); tmp++;
49             }
50         }
51         printf("%d\n",ans/2);
52     }
53 }
View Code

http://acm.hdu.edu.cn/showproblem.php?pid=5102

转载于:https://www.cnblogs.com/xiao-xin/articles/4084291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值