[bzoj 1912][Apio 2010]巡逻巡逻
无
Description
Input
第一行包含两个整数n,K(1 K 2)。
接下来n1行,每行两个整数a,b,表示村庄a与b之间有一条道路(1 a,b n)。
Output
输出一个整数,表示新建了K条道路后能达到的最小巡逻距离。
Sample Input
8 1
1 2
3 1
3 4
5 3
7 5
8 5
5 6
Sample Output
11
HINT
3 n 100,000,1 K 2。
Solution
不建道路时方案数为2(n-1)。
建一条道路时,把树直径两段连上,答案为2(n-1)-r 1。
此基础上再建一条道路:把树直径删去,在现在的图上再求一条直径。
那么,\(k\leq10^5\)要怎么做呢
#定义N 100005
结构图{
int nxt,to,w;
[N1];
int g[N],f1[N],f2[N],N,m,mx,id,ans,CNT=1;
布尔维斯[N];
内联void addedge(int x,int y){ 0
碳纳米管.NXT=g[x];g[x]=CNT;碳纳米管.to=y;碳纳米管.w=1;
}
内联void add(int x,int y){ 0
addedge(x,y);addedge(y,x);
}
内联int dfs(int u,int fa){ 0
int s1=0,S2=0;
对于(int i=g[u],tmp我;i=e[i]。nxt)
如果(e[i].敬!=fa){ 0
tmp=e[i].w dfs(e[i]).to,u);
if(tmp S1){ 0
S2=S1 S1 S1=TMpf2[u]=f1[u];f1[u]=I;
}
否则if(tmp S2){ 0
S2=tmp F2[u]=I;
}
}
if(s1 s2mx) mx=s1 s2,id=u;
返回S1;
}
内嵌void Aireen(){ 0
n=read();m=read();
for(int I=1;在;(一)
添加(read())(read());
ans=(n-1)1;
while(m-){ 0
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(F2));
MX=id=0;dfs(1,0);ans=1-MX;
for(int I=f1[id];我;i=f1 .至e[i].w=e[i^1].w=-1;
for(int I=F2[id];我;i=f1 .至e[i].w=e[i^1].w=-1;
}
printf('%d\n ',ans);
}
2017-05-03 22:23:28
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/116860.html