此题没有AC!!
但对拍了几个小时了,没有发现问题、、但就是过不了
如果有路过的dalao可以帮忙指导一下、、感激不尽
码(秒WA):
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 200007
#define inf 1e9+7
int tot,zhong[N*2],v[N*2],hou[N*2],xia[N],d[N],sz[N],i,max1,rt,x,y,z,k,ans[N],n;
bool vis[N];
void jia(int x,int y,int z)
{
++tot,zhong[tot]=y,v[tot]=z,hou[tot]=xia[x],xia[x]=tot;
}
void jian(int x,int y,int z)
{
jia(x,y,z);
jia(y,x,z);
}
struct lalala
{
int d,ds;
}q[100007];
void zzx(int o,int fu)
{ // cout<<o<<endl;
sz[o]=1;
int maxx=0;
for(int i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fu||vis[nd])continue;
zzx(nd,o);
sz[o]+=sz[nd];
maxx=max(maxx,sz[nd]);
}
maxx=max(maxx,tot-sz[o]);
if(maxx<max1)max1=maxx,rt=o;
}
void dfs(int o,int fu,int dis,int ddss)
{
q[++q[0].d].d=dis;
q[q[0].d].ds=ddss;
d[o]=dis;
for(int i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==fu||vis[nd])continue;
dfs(nd,o,dis+v[i],ddss+1);
}
}
bool cmp(lalala a,lalala b)
{
return a.d<b.d;
}
void calc(int o,int fu)
{
q[0].d=0;
dfs(o,fu,0,0);
sort(q+1,q+1+q[0].d,cmp);
int l=1,r=q[0].d;
while(l<r)
{
if(q[l].d+q[r].d==k){ ans[q[l].ds+q[r].ds]++; if(q[l+1].d+q[r].d==k)++l;else --r; }
else if(q[l].d+q[r].d<k)l++;
else r--;
}
}
void calc2(int o,int fu)
{
q[0].d=0;
dfs(o,fu,d[fu]-d[o],1);
sort(q+1,q+1+q[0].d,cmp);
int l=1,r=q[0].d;
while(l<r)
{
if(q[l].d+q[r].d==k){ ans[q[l].ds+q[r].ds]--; if(q[l+1].d+q[r].d==k)++l;else --r; }
else if(q[l].d+q[r].d<k)l++;
else r--;
}
}
void work(int o,int fu)
{//cout<<"O";
vis[o]=1;
calc(o,fu);
for(int i=xia[o];i!=-1;i=hou[i])
{
int nd=zhong[i];
if(nd==o||vis[nd])continue;
calc2(nd,o);
tot=sz[nd];
max1=inf;
zzx(nd,o);
work(nd,o);
}
}
int main()
{
memset(xia,-1,sizeof(xia));
scanf("%d%d",&n,&k);
for(i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
x++,y++;
jian(x,y,z);
}
max1=inf;
tot=n;
zzx(1,0);
work(rt,0);
for(i=1;i<=n;i++)
{
if(ans[i]>0)
{
printf("%d",i);
return 0;
}
}
printf("-1");
}