为什么第7个点一直TLE
查看原帖
为什么第7个点一直TLE
138349
银翼的魔术师楼主2020/7/21 17:40

本不想发帖的,但一直过不了且不知道是被卡常还是哪里写错了,非常难受。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<utility>
#include<bitset>
#include<cstdio>
#include<string>
#include<time.h>
#include<vector>
#include<cmath>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
const int N=1e4+5,M=1e7+5;
int f[N],ne[N<<1],t[N<<1],q[N<<1],b,s[N],r,rs,d[N],k,nm;
bool bk[M],v[N];
int read()
{
	int x=0;
	char c;
	do
		c=getchar();
	while(c>'9'||c<'0');
	while(c<='9'&&c>='0')
	{
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x;
}
void add(int u,int v,int w)
{
	ne[++b]=f[u];
	f[u]=b;
	t[b]=v;
	q[b]=w;
}
void num(int x,int fa)
{
	nm++;
	for(int i=f[x];i;i=ne[i])
		if(fa!=t[i]&&!v[t[i]])
			num(t[i],x);
}
void zx(int x,int fa)
{
	int mxs=0;
	s[x]=1;
	for(int i=f[x];i;i=ne[i])
		if(fa!=t[i]&&!v[t[i]])
		{
			zx(t[i],x);
			s[x]+=s[t[i]];
			mxs=max(mxs,s[t[i]]);
		}
	mxs=max(mxs,nm-s[x]);
	if(mxs<rs||!r)
	{
		r=x;
		rs=mxs;
	}
}
bool dfs(int x,int fa)
{
	if(d[x]>k)
		return 0;
	else
		if(bk[k-d[x]])
			return 1;
	for(int i=f[x];i;i=ne[i])
		if(t[i]!=fa&&!v[t[i]])
		{
			d[t[i]]=d[x]+q[i];
			if(dfs(t[i],x))
				return 1;
		}
	return 0;
}
void last(int x,int fa)
{
	if(d[x]>k)
		return;
	bk[d[x]]=1;
	for(int i=f[x];i;i=ne[i])
		if(t[i]!=fa&&!v[t[i]])
			last(t[i],x);
}
void pre(int x,int fa)
{
	if(d[x]>k)
		return;
	bk[d[x]]=0;
	for(int i=f[x];i;i=ne[i])
		if(t[i]!=fa&&!v[t[i]])
			pre(t[i],x);
}
bool df(int x)
{
	nm=r=0;
	num(x,0);
	zx(x,0);
	d[r]=0;
	bk[0]=1;
	for(int i=f[r];i;i=ne[i])
		if(!v[t[i]])
		{
			d[t[i]]=q[i];
			if(dfs(t[i],r))
			{
				for(int j=f[r];j;j=ne[j])
					if(!v[t[j]])
					{
						if(t[j]==t[i])
							break;
						pre(t[j],r);
					}
				return 1;
			}
			last(t[i],r);
		}
	pre(r,0);
	v[r]=1;
	for(int i=f[r];i;i=ne[i])
		if(!v[t[i]])
			if(df(t[i]))
				return 1;
	return 0;
}
int main()
{
	int n,m,u,vv,w;
	n=read(),m=read();
	for(int i=1;i<n;i++)
	{
		u=read(),vv=read(),w=read();
		add(u,vv,w);
		add(vv,u,w);
	}
	for(int i=1;i<=m;i++)
	{
		memset(v,0,sizeof(v));
		k=read();
		if(df(1))
			printf("AYE\n");
		else
			printf("NAY\n");
	}
}
2020/7/21 17:40
加载中...