Kai’blog

主博客 | 势利纷华,近之而不染者洁,不近者亦洁,君子不立危墙之下。

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
*/
posted @ 2023-11-01 11:30  Kai-G  阅读(20)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱垲. All rights reserved.