#include<bits/stdc++.h> #define FILE "read" #define MAXN 1000010 using namespace std; struct node{int y,next;}e[MAXN<<1]; int n,m,len,ans,Link[MAXN],d[MAXN],q[MAXN],cnt[MAXN],level[MAXN]; char buf[1<<15],*fs,*ft; inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} inline int read(){ int x=0,f=1; char ch=getc(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();} return x*f; } void insert(int x,int y){e[++len].next=Link[x];Link[x]=len;e[len].y=y;d[y]++;} void topsort(){ int head=0,tail=0; for(int i=1;i<=n;++i) if(d[i]==1) q[++tail]=i; while(++head<=tail){ for(int i=Link[q[head]];i;i=e[i].next){ if(--d[e[i].y]==1){ q[++tail]=e[i].y; level[q[tail]]=level[q[head]]+1; } } } } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); n=read(); m=read(); for(int i=1;i<n;++i){ int x=read(),y=read(); insert(x,y); insert(y,x); } topsort(); for(int i=1;i<=n;++i) cnt[level[i]]++; for(int i=0;cnt[i];++i) ans+=min(m*2,cnt[i]); printf("%d\n",ans); return 0; }
|