输入样例:
10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1
输出样例:
4
0 4 9 1
vis[i]中保存i可以变异出哪些病毒;
in[i]数组用来记录i病毒是不是由其他病毒变异过来的,如果in[i]为0,则其为源头病毒;
before[i]记录i的上级病毒;
为了保证序列最小,在输入Edge[i]后可对其进行一次排序;
然后通过BFS找到最多变异次数,过程中由maxl和ans标记最多变异次数量以及对应的病毒编号;
最后通过before找回完整变异链,因为变异链是逆序找回的,所以用栈f来存,最后输出即可。
#include
#define llu unsigned long long
using namespace std;
vector<int> vis[10010];
queue<pair<int,int> > q;
stack<int> f;
bool in[10010];
int before[10010];
int main()
{
int n;
cin >> n ;
for(int i=0;i<n;i++)
{
int k;
cin >> k;
for(int j=0;j<k;j++)
{
int x;
cin >> x ;
in[x]=1;//是别的病毒变异过来的,说明不是源头病毒
before[x]=i;
vis[i].push_back(x);
}
sort(vis[i].begin(),vis[i].end());//输出最小序列的准备工作
}
int begin;
for(int i=0;i<n;i++){
if(in[i]==0)begin=i;//入度为0,说明这个是源头病毒
}
int maxl=-1,ans=begin;
q.push({begin,1});
while(!q.empty())
{
int now=q.front().first,l=q.front().second;
q.pop();
if(l>maxl)
{
maxl=l;
ans=now;
}
for(int i=0;i<vis[now].size();i++)
{
q.push({vis[now][i],l+1});
}
}
cout << maxl << endl ;
while(ans!=begin){
f.push(ans);
ans=before[ans];
}
cout << begin ;
int t=f.size();
for(int i=0;i<t;i++){
cout << " " << f.top() ;
f.pop();
}
//cout << " "<< f.top();
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)