2021-PTA总决赛-L2-2 病毒溯源(DFS)
思路:
这题的唯一可能能被看作是陷阱的就是根节点不是0,由于不会有任何节点指向根节点,所以可以通过全部求和,再减去有被指向的节点的值,就是根节点了,剩下的就是单纯的DFS。
AcCode:
#include<bits/stdc++.h>
using namespace std;
vector<int> t[10010];
vector<int> ans, path;
void dfs(int rt){
if(t[rt].size() == 0){
//vector重载过等于号,所以直接比较即可
if(path.size() > ans.size() ||(path < ans && path.size() == ans.size())) ans = path;
return ;
}
for(int i = 0; i < t[rt].size(); i++){
path.push_back(t[rt][i]);
dfs(t[rt][i]);
path.pop_back();
}
}
int main(){
int N, rt;
cin >> N;
rt = (0 + N - 1) * N / 2;
for(int i = 0; i < N; i++){
int K;
cin >> K;
for(int j = 0; j < K; j++){
int v;
cin >> v;
rt -= v;
t[i].push_back(v);
}
}
dfs(rt);
cout << ans.size() + 1 << endl << rt;
for(int i = 0; i < ans.size(); i++){
cout << " " << ans[i];
}
return 0;
}