1 条题解

  • 0
    @ 2025-10-10 20:11:59

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=110;
    //存储每个点的深度及父元素
    int dep[N],fa[N]; 
    
    //链表:每条边的最后一个点编号,点的值,上个点的值 
    int fi[N],to[N*2],ne[N*2],k; 
    
    void add(int u,int v){
    	k++;
    	to[k] = v;
    	ne[k] = fi[u];
    	fi[u] = k;
    }
    
    //深搜求每个点的深度和父元素 
    void dfs(int x,int fath){
    	fa[x] = fath;//更新每个元素的父元素
    	dep[x] = dep[fath] + 1;//x的深度 = 父元素深度 + 1
    	
    	//遍历x能去的点
    	for(int i = fi[x];i != 0;i = ne[i]){
    		if(to[i] != fath) dfs(to[i],x);
    	} 
    } 
    
    int main()
    {
    	int n;
    	cin>>n;
    	int x,y;
    	cin>>x>>y;//求这两个点的公共祖先
    	
    	int a,b;
    	for(int i = 1;i < n;i++){
    		cin>>a>>b;
    		add(a,b);
    		add(b,a);
    	} 
    	
    	dfs(1,0);
    	
    	//从较深的元素向上找 
    	while(x != y){
    		if(dep[x] >= dep[y]) x = fa[x];
    		else y = fa[y];
    	}
    	
    	cout<<x;
        return 0;
    }
    
    • 1

    信息

    ID
    1085
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者