2014年3月6日 星期四
[HOJ] 237 - Patrol
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define N 100005
int vi[N]={0},tmp=0,p,flag=0;
vector<int> s[N],arr,que;
void dfs(int u,int add){
if(flag) arr.push_back(u);
if(add>tmp){
tmp=add;
p=u;
}
int i;
for(i=0;i<s[u].size();i++){
int v=s[u][i];
if(vi[v]==0){
vi[v]=1;
dfs(v,add+1);
if(flag) arr.pop_back();
vi[v]=0;
}
}
if(flag && add==tmp){
que=arr;
flag=0;
}
return;
}
int main(){
int n,k,i,j,x,y,ans,qw=0;
scanf("%d%d",&n,&k);
for(i=0;i<n-1;i++){
scanf("%d%d",&x,&y);
s[x].push_back(y);
s[y].push_back(x);
}
ans=2*(n-1);
vi[1]=1,dfs(1,0),vi[1]=0;
x=p,vi[p]=1,dfs(p,0),vi[x]=0;
flag=1,x=p,vi[p]=1,dfs(p,0),vi[x]=0;
arr.clear();
ans-=tmp-1;
if(k==1){
printf("%d\n",ans);
}
else{
memset(vi,0,sizeof(vi));
for(i=0;i<que.size();i++)
vi[que[i]]=1;
for(i=0;i<que.size();i++){
tmp=0;
p=que[i];
dfs(p,0);
arr.push_back(tmp);
vi[que[i]]=0,vi[p]=1;
dfs(p,0);
vi[que[i]]=1;
qw=max(qw,tmp);
}
for(i=0;i<que.size();i++){
for(j=i+1;j<que.size();j++)
qw=max(qw,arr[i]+arr[j]-(j-i));
}ans-=qw-1;
printf("%d\n",ans);
}
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言