题意
找最深层叶子的节点
思路
第i行的点的父节点是i,则根据这种方案建图。每行的数都是i的子节
坑点
需要找一下没出现过的点作为头结点
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> g[N];//存节点
int res[N];//记录出现过的
void dfs(int u, int cnt)//当前在那个点,当前点在第几层
{
res[u] = cnt;
for (int i = 0; i < g[u].size(); i ++ )
{
int j = g[u][i];
dfs(j, cnt + 1);
}
}
int main()
{
int n;
cin >> n;//门的数量
for (int i = 1; i <= n; i ++ )
{
int k; cin >> k;//编号为i的可通向的门
for (int j = 0; j < k; j ++ )//遍历
{
int x; cin >> x;//每个的数量
res[x] = 1;//记录点出现过
g[i].push_back(x);//存点
}
}
int h;//找头结点
for (int i = 1; i <= n; i ++ )
{
if (!res[i]) //如果未出现过
{
h = i;//为头结点
break;//停止
}
}
dfs(h, 1);//从1 开始向下搜索
int maxn = 0;//找最大层
int ans = 0;//结果
for (int i = 1; i <= n; i ++ )
{
if (res[i] > maxn)//找最大值的点
{
maxn = res[i];//更新最大层
ans = i;//ans 等于该点
}
}
cout << ans ;//最后输出最后一层的点
return 0;
}
总结
难度中等,需理清搜索思路