90分#9求助
查看原帖
90分#9求助
421265
eastcloud楼主2021/6/29 20:01
#include<iostream>
//广搜的思路,查找节点
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
queue<int> l;//广搜的队列
vector<int> t[101];//记录它的父节点
vector<int> chu[101];//记录它的子节点
int a[101],ru[101],du[101],ceng[101];//ru是每个点的入度,a检测每个点有没有被遍历,du为每个点的度,层为同一层的节点数
int main(){
	int n,u,v;
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		ru[v]++;
		chu[u].push_back(v);
		t[v].push_back(u);
	}
   //初始化
	int be=1;
	while(ru[be])be++;
	cin>>u>>v;
	l.push(be);
	du[be]=1;
	int ma=0;
   //广搜标记每层节点数和查找深度
	while(!l.empty()){
		int x=l.front();
		a[x]++;
		l.pop();
		if(1){
			for(int i=0;i<chu[x].size();i++){
				if(!a[chu[x][i]]){
					l.push(chu[x][i]);
					du[chu[x][i]]=du[x]+1;
					ma=max(du[chu[x][i]],ma);
					ceng[du[chu[x][i]]]++;
				}
			}	
		}
	}
	cout<<ma<<endl;
	ma=0;
	for(int i=1;i<=n;i++)ma=max(ma,ceng[i]);
	cout<<ma<<endl;
	memset(a,0,sizeof(a));
	l.push(u);
	a[u]=1;
   //从两方向找
	while(!l.empty()){
		int x=l.front();
		l.pop();
		if(a[x]){
			for(int i=0;i<t[x].size();i++){
				if(!a[t[x][i]]){
					l.push(t[x][i]);
					a[t[x][i]]=a[x]+2;
					if(t[x][i]==v){
						cout<<a[t[x][i]];
						break;
					}
				}
			}
			for(int i=0;i<chu[x].size();i++){
				if(!a[chu[x][i]]){
					l.push(chu[x][i]);
					a[chu[x][i]]=a[x]+1;
					if(chu[x][i]==v){
						cout<<a[chu[x][i]]-1;
						break;
					}
				}
			}	
		}
	}
	return 0;
}

2021/6/29 20:01
加载中...