自己对拍了多组数据,写法应该没问题,但交上去总是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
*/