同一个思路,找树上直径中心然后向外贪心延伸,前者用结构体储存,后者直接开数组再加一些小优化(从结果上看是负优化了23333),结果前面的A了后面的T了#2#3#6的3个点,实在看不出为什么,求问大佬们哪里出了问题(
//AC的
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,m,num,vm,L,R;
int head[605];
struct egde{
int v,to,next;
}a[605];//链式前向星
struct pot{
int f,k;
}b[305];//记录节点父亲和与其父亲的路径价值
struct deep{
int d,md,z;
}p[305];//记录深度、最深深度和是否被记录为中心节点
void add(int x,int y,int v){
a[++num].next=head[x];
a[num].to=y;
a[num].v=v;
head[x]=num;
}
void dfs1(int t,int tf)
{
if(p[t].d>vm)
{
vm=p[t].d;
L=t;
}
for(int i=head[t];i;i=a[i].next)
{
if(p[a[i].to].d<p[t].d+a[i].v&&a[i].to!=tf)
{
p[a[i].to].d=p[t].d+a[i].v;
dfs1(a[i].to,t);
}
}
}
void dfs2(int t,int tf)
{
if(p[t].d>vm)
{
vm=p[t].d;
R=t;
}
for(int i=head[t];i;i=a[i].next)
{
if(p[a[i].to].d<p[t].d+a[i].v&&a[i].to!=tf)
{
p[a[i].to].d=p[t].d+a[i].v;
b[a[i].to].f=t;
b[a[i].to].k=a[i].v;
dfs2(a[i].to,t);
}
}
}//两边dfs找直径
void dfsmark(int t,int tf)
{
p[t].md=p[t].d;
for(int i=head[t];i;i=a[i].next)
{
if(a[i].to!=tf)
{
b[a[i].to].f=t;
p[a[i].to].d=p[t].d+a[i].v;
dfsmark(a[i].to,t);
p[t].md=max(p[t].md,p[a[i].to].md);
}
}
}//标记深度
void dfsfix(int t,int tf,int st)
{
for(int i=head[t];i;i=a[i].next)
{
if(a[i].to!=tf)
{
p[a[i].to].d-=p[st].d;
p[a[i].to].md-=p[st].d;
dfsfix(a[i].to,t,st);
}
}
}//修改深度
int main()
{
int x,y,v,mid;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&v);
add(x,y,v);
add(y,x,v);
}
dfs1(1,0);
vm=0;
for(int i=1;i<=n;i++)
p[i].d=0;
dfs2(L,0);
v=0;
if(n>1)
{
for(mid=R;mid;mid=b[mid].f)
{
v+=b[mid].k;
if(v>=vm/2)
{
if(vm/2-(v-b[mid].k)>=b[mid].k/2)
mid=b[mid].f;
//cout<<endl<<mid<<' '<<v<<' '<<endl;
break;
}
}
}
for(int i=1;i<=n;i++)
p[i].d=0;
//cout<<endl<<L<<' '<<R<<' '<<mid<<endl;
dfsmark(mid,0);
v=0;
p[mid].z=1;
while(v<=m)
{
int t=0,val=0;
for(int i=1;i<=n;i++)
{
if(p[i].md>val&&p[b[i].f].z&&!p[i].z)
{
val=p[i].md;
t=i;
}
}
v+=p[t].d;
if(v>m)
{
v-=p[t].d;
//cout<<t<<' '<<v<<' ';
cout<<p[t].md<<endl;
break;
}
p[t].z=1;
dfsfix(t,b[t].f,t);
}
return 0;
}
//TLE的
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,m,num,L,R;
int head[605],f[305],k[305],d[305],md[305],b[305];
struct egde{
int next,to,v;
}a[605];
void add(int x,int y,int v)
{
a[++num].next=head[x];
a[num].to=y;
a[num].v=v;
head[x]=num;
}
void dfs1(int t,int tf)
{
if(d[t]>d[L])
L=t;
for(int i=head[t];i;i=a[i].next)
{
if(d[t]+a[i].v>d[a[i].to]&&a[i].to!=tf)
{
d[a[i].to]=d[t]+a[i].v;
dfs1(a[i].to,t);
}
}
}
void dfs2(int t,int tf)
{
if(d[t]>d[L])
R=t;
for(int i=head[t];i;i=a[i].next)
{
if(d[t]+a[i].v>d[a[i].to]&&a[i].to!=tf)
{
d[a[i].to]=d[t]+a[i].v;
f[a[i].to]=t;
k[a[i].to]=a[i].v;
dfs2(a[i].to,t);
}
}
}
void dfsmark(int t,int tf)
{
md[t]=d[t];
for(int i=head[t];i;i=a[i].next)
{
if(a[i].to!=tf)
{
d[a[i].to]=d[t]+a[i].v;
f[a[i].to]=t;
dfsmark(a[i].to,t);
md[t]=max(md[t],md[a[i].to]);
}
}
}
void dfsfix(int t,int tf,int st)
{
for(int i=head[t];i;i=a[i].next)
{
if(a[i].to!=tf)
{
d[a[i].to]-=d[st];
md[a[i].to]-=d[st];
dfsfix(a[i].to,t,st);
}
}
}
int main()
{
int x,y,v;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&v);
add(x,y,v);
add(y,x,v);
}
dfs1(1,0);
for(int i=1;i<=n;i++)
d[i]=0;
dfs2(L,0);
int mid=R;
if(n>1)
{
v=0;
while(mid)
{
v+=k[mid];
if(v>=d[R]/2)
{
if(d[R]/2-(v-k[mid])>=k[mid]/2)
{
mid=f[mid];
break;
}
}
//cout<<mid<<' '<<v<<' '<<k[mid]<<endl;
mid=f[mid];
}
}
//cout<<endl<<L<<' '<<R<<' '<<mid<<' '<<v<<' '<<d[R]<<endl;
for(int i=1;i<=n;i++)
d[i]=0;
dfsmark(mid,0);
b[mid]=1;
v=0;
while(v<=m)
{
int t=0;
for(int i=1;i<=n;i++)
{
if(!b[i]&&b[f[i]]&&md[i]>md[t])
{
t=i;
}
}
v+=d[t];
if(v>m)
{
cout<<md[t]<<endl;
break;
}
b[t]=1;
dfsfix(t,f[t],t);
}
return 0;
}