#include "bits/stdc++.h" #include "string.h" using namespace std; const int N = 1e5 + 10; int s[N]; vector<int> a[N]; vector<int> v; int k = 0; bool cmp(vector<int> x,vector<int> y){ if(x.size() != y.size()) return x.size() > y.size() ; else return x < y; } void find(int x){; a[k].push_back(x); if(s[x] != -1) { find(s[x]); } else return ; } int main(){ int n; memset(s, -1, sizeof(s)); cin>>n; int m = n; int x, y, h = 0; for(int i = 0; i < n; i++){ cin>>x; if(x == 0) v.push_back(i); int z = x; while(z--){ cin>>y; s[y] = i; } } for(int i = 0; i < v.size(); i++){ find(v[i]); k ++; reverse(a[k - 1].begin(), a[k - 1].end()); } sort(a, a + k, cmp); cout<<a[0].size()<<endl; for(int i = 0; i < a[0].size(); i++){ cout<<a[0][i]; if(i != a[0].size() - 1 ) cout<<" "; } return 0; }
思路:很简单的题目,其实就是一个查集往上找根,因为我们把所有点的初始父点都设为-1,在加入所有节点的父节点之后,从叶子结点一直向上找,由于源头只有一个,所以必定会自然的找到一个节点,其父节点是-1,这也是唯一一个没有直接源病毒的节点,因为其就是源病毒。叶子结点就是没有子节点的,反映到题目上就是没有衍生变异病毒,也就是每一行的第一个数是0。笔者其实最一开始就写对了,但是一直用的字符串排序,一直错搞心态,因为数字很大的时候字符就表示不了了,所有很多时候不能用数字转字符进行比较,虽然字符串比较大小比较方便,但也要注意范围啊!