题目:
思路:
dfs深搜,深搜前排序,保证我们搜到的是最小序列;
Code:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <utility>
#include <stack>
#include <map>
#include <cmath>
#include <numeric>
#include <vector>
#include <set>
#define Ilove return
#define pjq 0
#define mes memset
#define mec memcpy
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
const int N = 100010;
const int null = 0x3f3f3f3f;
const ll mod = 1000000007;
int n;
vector<int> v[N];
vector<int> ans;
bool st[N];
void dfs(int x, vector<int>&vv)
{
//当找到更长的序列时,更新答案数组
if (vv.size() > ans.size())
{
ans.clear();
for (int i = 0; i < vv.size(); i++)
{
ans.push_back(vv[i]);
}
}
for (int i = 0; i < v[x].size(); i++)
{
vv.push_back(v[x][i]);
dfs(v[x][i], vv);
vv.pop_back();
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
int k;
cin >> k;
for (int j = 0; j < k; j++)
{
int x;
cin >> x;
v[i].push_back(x);
//记录源头
st[x] = true;
}
//排序,保证我们搜到的时最小序列
sort(v[i].begin(), v[i].end());
}
for (int i = 0; i < n; i++)
{
//只有是源头的时候我们才进行深搜
if (!st[i])
{
vector<int> vv;
vv.push_back(i);
dfs(i, vv);
}
}
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++)
{
if (i)
{
cout << " ";
}
cout << ans[i];
}
Ilove pjq;
}