L2-031 深入虎穴 (25 分)
题意
思路
- 第i行的点的父节点是i,则根据这种方案建图。每行的数都是i的子节
坑点
1.需要找一下没出现过的点作为头结点
代码
#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;
}