L2-031 深入虎穴 (25 分)
题目
思路
题目说明了没有两个路通往一扇门,说明没有环,这是一棵树,由此问题转化为求树的深度。
开始用从根开始的深搜,写完了才发现需要输出节点,于是重新写从叶子开始的深搜,加上简单剪枝——即已经求出深度的不重复求。没有什么优化就直接过了。
代码
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f
#define pb push_back
using namespace std;
typedef pair<int, int> P;
const int N = 1e5 + 10;
typedef long long ll;
vector<int> pre[N];
bool vis[N];
int num[N];
int dfs(int u)
{
if(num[u])
return num[u];
if(!pre[u].size())
return 0;
for(auto v : pre[u])
{
num[u] = max(dfs(v) + 1, num[u]);
}
return num[u];
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
int m;
cin >> m;
for(int j = 1, x; j <= m; j++)
{
cin >> x;
pre[x].pb(i);
vis[x] = 1;
}
}
int maxx = -1, id = 0;
for(int i = 1; i <= n; i++)
{
int tmp = dfs(i);
if(tmp > maxx)
{
maxx = tmp;
id = i;
}
}
cout << id << endl;
return 0;
}