列表

详情


NC54712. 吃桃

描述

在一颗个节点的树上每个节点上都有一个桃子,牛妹初始在节点,她想每一步都要吃到桃子并且吃到尽可能多的桃子,同时又希望在两种方案相同的情况下优先选择节点编号小的(因为那样更加美味)。请你帮助牛妹找到这条吃桃路径并依次输出这些节点的编号。

输入描述

第一行:两个整数
接下来行:两个正整数x_i, y_i,表示这两个节点有一条边相连。

输出描述

若干行:每行一个整数表示牛妹依次经过的节点编号

示例1

输入:

7 3
1 2
2 6
2 3
3 4
3 5
5 7

输出:

3
2
1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 87ms, 内存消耗: 11208K, 提交时间: 2019-12-11 21:24:38

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long ll;
const int N=1e5+5;
vector<int> p[N];
int nex[N],dep[N];

void dfs(int x,int f)
{
    for (int y:p[x]){
        if (y==f) continue;
        dfs(y,x);
        if (dep[x]<dep[y]+1){
            dep[x]=dep[y]+1;
            nex[x]=y;
        }else if (dep[x]==dep[y]+1 && nex[x]>y){
            nex[x]=y;
        }
    }
}

int main()
{
    int n,k;

    scanf("%d%d",&n,&k);
    int t1,t2;
    for (int q=1;q<n;q++){
        scanf("%d%d",&t1,&t2);
        p[t1].pb(t2);
        p[t2].pb(t1);
    }
    dfs(k,0);
    while (k!=0){
        printf("%d\n",k);
        k=nex[k];
    }
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 151ms, 内存消耗: 9408K, 提交时间: 2023-01-10 17:55:43

#include<bits/stdc++.h>
using namespace std;

const int N=100010;
int n,k;
int r[N],lt[N];
vector<int> v[N];

void dfs(int x,int fa)
{
	for(int i=0;i<v[x].size();i++){
		if(fa==v[x][i]) continue;
		dfs(v[x][i],x);
		if(r[x]<r[v[x][i]]+1){
			r[x]=r[v[x][i]]+1;
			lt[x]=v[x][i];
		}
		
	}
}

int main()
{
	cin >> n >> k;
	int x,y;
	for(int i=1;i<n;i++){
        cin >> x >> y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(k,0);
	while(k){
		cout << k << endl;
		k=lt[k];
	}
} 

上一题