80分,暴力求,但是错两个点
查看原帖
80分,暴力求,但是错两个点
443754
Sender_T楼主2021/7/17 22:07

qwq萌新只会暴力找祖先 3和6错了

#include<iostream>
using namespace std;
const int size = 101;
struct node{
	long long fa,deep;
};
node nd[size];
int u,v;
int n;
int sn,en; // 开始与结束 
int coll_root_b[size]; // b的父亲结点集合 
int num[size],num2[size];
int root;
int r_root;
int location;
long long maxans,maxwid[size];
void findroot(int u,int loc){   //查找root 
	if(nd[u].fa==-1){
		location=loc;
		return;
	}
	num[nd[u].fa]=loc;
	coll_root_b[loc]=nd[u].fa;
	//cout<<nd[u].fa;
	//cout<<coll_root_b[loc];
	findroot(nd[u].fa,loc+1);
}
long long loc2=1;
long long dfs(int u){
    if(nd[u].fa==-1) return -1; //没有找到
	int tmp = nd[u].fa;
	num2[nd[u].fa]= loc2++;
	for(int i=0;i<location;i++){
		if(coll_root_b[i]==tmp){
			return tmp;
		}
	}
	dfs(nd[u].fa);	
}
int main(){
	cin>>n;
	nd[1].fa=-1;
	nd[1].deep=1;
	for(int i=1;i<=n-1;i++){
		cin>>u>>v;
		nd[v].fa=u;
		nd[v].deep = nd[u].deep+1;
		maxans = max(maxans,nd[v].deep);
		maxwid[nd[u].deep]++;
	}
	cin>>sn>>en;
	findroot(en,1);
	//for(int i=1;i<location;i++) cout<<coll_root_b[i]<<"|";
	r_root = dfs(sn);
	long long ans = num[r_root] + num2[r_root]*2;
	long long width=1;
	for(int i=1;i<=maxans;i++) width=max(width,maxwid[i]);
	if(sn==en){
		cout<<maxans<<endl;
	    cout<<width<<endl;
		cout<<"0";
		return 0; 
	}
	cout<<maxans<<endl;
	cout<<width<<endl; 
	cout<<ans;
	return 0;
}
2021/7/17 22:07
加载中...