【bzoj1509】 NOI2003 逃学的小孩 树的直径

做以前的题感觉好水呀,第一想法是最短路,结果发现读错题了。后来想一下,只需要找到树的直径,然后从这两点求出到每个点的dis数组,然后枚举一下每一个点就可以了,这么水还调了这么长时间也真是颓废呀。


#include
#include
#include
#include
#include
#include
#define maxn 210000
#define inf 2000000010

using namespace std;

int n,m,num;
int next[2*maxn],to[2*maxn],head[maxn],len[2*maxn];
long long dis[maxn],disa[maxn],disb[maxn];
bool vis[maxn];
int q[maxn];
long long ans;

void addedge(int x,int y,int z)
{
	num++;to[num]=y;len[num]=z;next[num]=head[x];head[x]=num;
}

void spfa(int x,long long dis[])
{
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++) dis[i]=inf;
	dis[x]=0;
	int l=0,r=1;
	vis[x]=1;q[1]=x;
	while (ldis[tt]) tt=i;
	spfa(tt,disa);
	int dd=tt;
	for (int i=1;i<=n;i++) if (disa[i]>disa[dd]) dd=i;
	spfa(dd,disb);
	ans=disa[dd];
	long long mx=0;
	for (int i=1;i<=n;i++)
	  mx=max(mx,min(disa[i],disb[i]));
	printf("%lld\n",ans+mx);
	return 0;
}


你可能感兴趣的:(树)