求助运行时错误
查看原帖
求助运行时错误
143841
Star1_3st楼主2020/10/17 13:37

自己对拍了多组数据,写法应该没问题,但交上去总是RE。

检查了一下,数组好像也没越界,dfs里也没有大数组,咋就RE了呢?

求解答。

#include<bits/stdc++.h>
long long k,n,nmb;
long long hd[20001],to[20001],nxt[20001],dpth[20001],bk[20001],f[20001][7],mf[20001][3];
inline long long minn(long long x,long long y)
{
	return x<y?x:y;
}

inline long long maxn(long long x,long long y)
{
	return x>y?x:y;
}

inline void clr()
{
	memset(hd,0,sizeof(hd));
	memset(to,0,sizeof(to));
	memset(nxt,0,sizeof(nxt));
	memset(dpth,0,sizeof(dpth));
	memset(bk,0,sizeof(bk));
	memset(f,0,sizeof(f));
	for(register int i=0;i<=20000;i=-~i)
		for(register int j=0;j<=2;j=-~j)
			mf[i][j]=2147483647;
	return;
}

inline void add(long long u,long long v)
{
	nmb=-~nmb;
	to[nmb]=v;
	nxt[nmb]=hd[u];
	hd[u]=nmb; 
	return;
}

inline void dfs1(long long s,long long d)
{
	dpth[s]=d;
	bk[s]=1;
	for(register int i=hd[s];i;i=nxt[i])
		if(!bk[to[i]])
			dfs1(to[i],-~d);
	return;
}

inline void dfs2(long long s)
{
	
	//if(s==1)
	//	printf("fuck\n"); 
	//
	
	long long p=0;
	for(register int i=hd[s];i;i=nxt[i])
		if(dpth[to[i]]>dpth[s])
		{
			p=1;
			dfs2(to[i]);
		}
		
	if(!p)
	{
		f[s][1]=f[s][3]=f[s][4]=f[s][5]=2147483647;
		f[s][2]=100;
		return;
	}
	
	for(register int i=hd[s];i;i=nxt[i])
	{
		if(dpth[to[i]]<dpth[s])
			continue;
		long long mi=2147483647;
		for(register int j=1;j<=6;j=-~j)
			mi=minn(mi,f[to[i]][j]);
		f[s][5]+=mi;
	}
	
	f[s][5]+=500;
	for(register int i=hd[s];i;i=nxt[i])
	{
		if(dpth[to[i]]<dpth[s])
			continue;
		long long mi=2147483647;
		for(register int j=1;j<=6;j=-~j)
			if(!(j^2)||!(j^4)||!(j^5))
				mi=minn(mi,f[to[i]][j]);
		f[s][6]+=mi;
		f[s][2]+=mi;
	}
	
	f[s][2]+=100;
	long long mx=-1,mx1=-1,nmx;
	for(register int i=hd[s];i;i=nxt[i])
	{
		if(dpth[to[i]]<dpth[s])
			continue;
		for(register int j=1;j<=6;j=-~j)
			if(!(j^2)||!(j^4)||!(j^5))
				mf[to[i]][1]=minn(mf[to[i]][1],f[to[i]][j]);//if(to[i]==5&&s==1)printf("FUCK5 %d %d %d FUCK5\n",j,f[to[i]][j],mf[to[i]][1]);}
			else
				mf[to[i]][2]=minn(mf[to[i]][2],f[to[i]][j]);
		mf[to[i]][0]=mf[to[i]][1]-mf[to[i]][2];
		f[s][1]+=mf[to[i]][1];
		f[s][4]+=mf[to[i]][1];
		f[s][3]+=mf[to[i]][1];
		
		if(mf[to[i]][0]>mx)
		{
			mx=mf[to[i]][0];
			nmx=to[i];
		}
		
		//if(s==1) printf("fuck%d  %d %d %d %d %d %d %d\n",to[i],mf[to[i]][0],f[s][1],f[s][3],f[s][4],mf[to[i]][1],mf[to[i]][2],mx);
	}
	
	f[s][1]+=100-(mx>0?mx:0);
	f[s][4]+=175-(mx>0?mx:0);
	for(register int i=hd[s];i;i=nxt[i])
	{
		if(dpth[to[i]]<dpth[s])
			continue;
		if(nmx^to[i]&&mf[to[i]][0]<=mx&&mf[to[i]][0]>mx1)
			mx1=mf[to[i]][0];
	}
	
	f[s][3]+=175-(mx>0?mx:0)-(mx1>0?mx1:0);
	//if(s==1) printf("%d %d %d\n",f[s][1],f[s][3],f[s][4]);
	//if(s==1) printf("FUCKYOU\n");
	return;
}

int main()
{
	//std::cin>>k;
	scanf("%lld",&k);
	while(k--)
	{
		//std::cin>>n;
		scanf("%lld",&n);
		clr();
		for(register int i=1;i<=~-n;i=-~i)
		{
			long long u,v;
			//std::cin>>u>>v;
			scanf("%lld%lld",&u,&v);
			add(-~u,-~v);
			add(-~v,-~u);
		}
		
		dfs1(1,0);
		memset(bk,0,sizeof(bk));
		dfs2(1);
		long long ans=2147483647;
		for(register int i=1;i<=6;i=-~i)
			ans=minn(ans,f[1][i]);
		printf("$%lld\n",ans);
		/*for(register int i=1;i<=n;i=-~i)
		{
			for(register int j=1;j<=6;j=-~j)
				printf("%d ",f[i][j]);
			putchar('\n');
		}*/
	}
	
	return 0;
}

/*

1:100不给
2:100给
3:175不给
4:175给
5:500
6:0


1
3
0 1
1 2


1
11
0 1
0 2
0 3
1 4
2 5
2 6
2 7
2 8
3 9
0 10


2
25
0 1
0 2
0 3
0 4
1 5
1 6
2 7
2 8
2 9
3 10
4 11
4 12
4 13
4 14
6 15
6 16
8 17
9 18
9 19
9 20
11 21
13 22
13 23 
13 24
15
0 1
0 2
1 3
1 4
1 5
1 6
2 7
2 8
3 9
3 10
3 11
3 12
4 13
4 14


1 
50
0 1
0 2
0 3
1 4
1 5
1 6
1 7
1 8
2 9
2 10
2 11
2 12
3 13
4 14
4 15
4 16
4 17
5 18
5 19
6 20
6 21
6 22
7 23
7 24
8 25
8 26
9 27
10 28
11 29
11 30
12 31
13 32
16 33
18 34
19 35
19 36
23 37
23 38
23 39
35 40
35 41
35 42
37 43
37 44
37 45
37 46
38 47
38 48
39 49


*/



2020/10/17 13:37
加载中...