您的位置:首页 > 其它

hdu5102 bfs

2015-08-04 20:21 232 查看
一棵树上前k个两点间最短路的距离和

#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1 | 1
#define lowbit(x) x&(-x)
using namespace std;
const int N=1e5+10;
long long INF=-1e15;
const int MOD=1e9+7;
int T,n,m,k,x,y,z,l,tot,cnt;
long long ans;
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;
}edge[N*20];
int head
;
void addedge(int u,int v){
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
queue<node> q;
void bfs(){
while(!q.empty()){
node now=q.front();q.pop();
int u=now.u,v=now.v,d=now.d;
for(int i=head[v];~i;i=edge[i].next){
int to=edge[i].v;
if(to==u) continue;
cnt++;
ans+=d+1;
q.push(node(v,to,d+1));
if(cnt>=k) break;
}
if(cnt>=k) break;
}
}
int main()
{
#ifndef  ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
memset(head,-1,sizeof head);
tot=0;
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++) q.push(node(i,i,0));
cnt=0;
ans=0;
k*=2;
bfs();
printf("%I64d\n",ans/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: