P3844【黄】
这道题做的极其折磨
因为最开始小看这道题了,没用稳扎稳打的码风来写代码,直接用的那种可读性极差但勉强能跑的代码写的,最后没AC只有73分调了好久也没调对,甚至逐渐调成了64、55越来越低的分。这有多方面原因,一方面是读题不仔细,错会题意了;二是没用标准解法,用的是自己的图快点写完的那种简单dfs瞎**搜;三是没用OOP思想,这类题应该用OOP思想的。
后来调了好久,偶然发现了一个获取不让下载的洛谷的小数据的办法,只是不能多用,否则可能会被封号,虽然没有明令禁止,但解释权在人家手里还是别惹人家为好。原理很简单,直接输出输入数据,第一次的代码输出的是输入的第一个数据,第二个则输出输入的第二个数据,以此类推。在WA界面就能看到“某行某列输出了**,期望是**”或者AC,就知道那个输入数据是多少了。换句话说一次评测能达到一个字符,效率极低,仅适用于实在做不出来急缺hack数据的时候使用,还得要求输入数据别太大,最好事先检查一下到底打不打再决定用不用这个方法
Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int b[105],p[1000],l[1000],r[1000],np[1000],nl[1000],nr[1000],A[100000],Tflag=0,tans,w,u,n,x,y,ans=1e8,nomax=-1e8;
void redfs(int i,int j)
{
b[i]=1;b[j]=1;
np[j]=i;
if(nl[i]==0)nl[i]=j; else nr[i]=j;
if(l[j]<=n&&l[j]>=1&&b[l[j]]==0&&l[j]!=0)redfs(j,l[j]);
if(r[j]<=n&&r[j]>=1&&b[r[j]]==0&&r[j]!=0)redfs(j,r[j]);
if(p[j]<=n&&p[j]>=1&&b[p[j]]==0&&p[j]!=0)redfs(j,p[j]);
}
int dfs1(int i,int to,int step)
{
if(i==to)
{
return step;
}
b[i]=1;
int ans;
if(p[i]!=0&&b[p[i]]==0)if((ans=dfs1(p[i],to,step+2))!=-1) return ans;
if(l[i]!=0&&b[l[i]]==0)if((ans=dfs1(l[i],to,step+1))!=-1) return ans;
if(r[i]!=0&&b[r[i]]==0)if((ans=dfs1(r[i],to,step+1))!=-1) return ans;
return -1;
}
void dfs2(int i,int step)
{
ans=max(step,ans);
b[i]=step;
if(p[i]!=0&&b[p[i]]==0)dfs2(p[i],step+1);
if(l[i]!=0&&b[l[i]]==0)dfs2(l[i],step+1);
if(r[i]!=0&&b[r[i]]==0)dfs2(r[i],step+1);
}
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
cin>>w>>u;
if(p[w]==0)p[w]=u;else if(l[w]==0)l[w]=u;else r[w]=u;
if(p[u]==0)p[u]=w;else if(l[u]==0)l[u]=w;else r[u]=w;
}
cin>>x>>y;
//for(int i=1;i<=n;i++)cout<<p[i]<<' '<<l[i]<<' '<<r[i]<<endl;
redfs(0,1);
for(int i=1;i<=n;i++)p[i]=np[i],r[i]=nr[i],l[i]=nl[i];
//for(int i=1;i<=n;i++)cout<<p[i]<<' '<<l[i]<<' '<<r[i]<<endl;
ans=-1e8;for(int i=1;i<=n;i++)b[i]=0;
dfs2(1,1);
cout<<ans<<endl;
for(int i=1;i<=n;i++)A[b[i]]++;
ans=-1e8;
for(int i=1;i<100000;i++)
ans=max(ans,A[i]);
cout<<ans<<endl;
for(int i=1;i<=n;i++)b[i]=0;
cout<<dfs1(x,y,0)<<endl;
return 0;
}
/*
6
4 5
2 6
4 2
1 3
4 1
2 5
6
4 5
2 6
4 2
1 3
1 4
2 5
6
4 5
2 6
4 2
1 3
4 1
5 2
6
4 5
2 6
4 2
1 3
1 4
5 2
*/