题意:给定一些病毒之间的变异关系,找出其中最长的一条变异链。不考虑循环遍历。有N种病毒,每种病毒都有k个二代变异病毒。保证源头只有一个。
题解:深度优先搜索DFS,因为题目中规定源头只有一个,所以把所有的二代变异病毒都储存起来,找到唯一一种没有出现在二代变异的病毒,把他作为源点,开始深搜,否则的话会TLE。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#define PI 3.14159
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
const int MAX_INT = 0x3f3f3f3f;
const int N = 1e5+15;
const int mod = 1e9+7;
int h[N],e[N],ne[N];
int dit=0;
int ans = 0;
vector<int> res , v;
bool st[N];
int flag[N];
void add(int a,int b)
{
e[dit] = b;
ne[dit] = h[a];
h[a] = dit++;
}
void dfs(int u,int dist)
{
if(dist>ans)
{
res = v;
ans = dist;
}
else if(dist==ans && v<res)
{
res = v;
}
for(int i = h[u];i!=-1;i=ne[i])
{
int j = e[i];
if(st[j]==false)
{
st[j] = true;
v.push_back(j);
dfs(j,dist+1);
st[j] = false;
v.pop_back();
}
}
}
void solve()
{
memset(h,-1,sizeof h);
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int k;
cin>>k;
for(int j=1;j<=k;j++)
{
int b;
cin>>b;
add(i,b);
flag[b] = 1;
}
}
int yuan = 0;
for(int i=0;i<n;i++)
{
if(flag[i] == 0)
{
yuan = i;
break;
}
}
v.push_back(yuan);
dfs(yuan,1);
cout<<ans<<endl;
cout<<res[0];
for(int i=1;i<res.size();i++)
cout<<" "<<res[i];
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T = 1;
while(T--)
{
solve();
}
}