7-12 这是二叉搜索树吗?
题意
给你一个树前序遍历的结果,让你判定这是不是一棵二叉搜索树
思路
根据二叉搜索树的性质,根结点大于它的左儿子,小于它的右儿子,我们dfs便利一遍他的数组,判断这个数组能不能构成一棵二叉搜索树即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 1e5 + 10;
int n, m;
int a[N], b[N];
int flag;
void dfs(int l, int r) {
if (l > r) {
return;
}
int i = l + 1, j = r;
if (!flag) {
while (i <= r && a[i] < a[l]) {
i++;
}
while (j > l && a[j] >= a[l]) {
j--;
}
} else {
while (i <= r && a[i] >= a[l]) {
i++;
}
while (j > l && a[j] < a[l]) {
j--;
}
}
if (i - j != 1) {
return;
}
dfs(l + 1, j);
dfs(i, r);
b[++b[0]] = a[l];
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
dfs(1, n);
if (b[0] != n) {
flag = 1;
b[0] = 0;
dfs(1, n);
}
if (b[0] == n) {
cout << "YES" << "\n";
cout << b[1];
for (int i = 2; i <= n; i++) {
cout << " " << b[i];
}
} else {
cout << "NO" << "\n";
}
}
int32_t main() {
int t = 1;
//cin >> t;
while (t--) {
solve();
}
}
[7-10 红色警报] (https://pintia.cn/problem-sets/1772539187410104320/exam/problems/1772539325331394569?type=7&page=0)
题意:
给你一个图,依次删去一些节点,问你这个图联通块的数量有没有增加
思路
由于题目中所给的数据范围很小,我们可以对于每一个删除的点直接暴力dfs 来判断图中联通块的数量有没有增加。
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 1e5 + 10;
int n, m;
int a[N], vis[N];
vector<int> v[N];
map<int, int> mp;
void dfs(int x) {
vis[x] = 1;
for (int i = 0; i < v[x].size(); i++) {
int j = v[x][i];
if (!vis[j] && mp.count(j) == 0) {
dfs(j);
}
}
}
void solve() {
cin >> n >> m;
int x, y;
while (m--) {
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
int q;
cin >> q;
for (int i = 1; i <= q; i++) {
cin >> a[i];
}
int cnt = 0;
for (int i = 0; i < n; i++) {
if (!vis[i]) {
dfs(i);
cnt++;
}
}
for (int i = 1; i <= q; i++) {
memset(vis, 0, sizeof(vis));
int cnt1 = 0;
mp[a[i]] = 1;
for (int j = 0; j < n; j++) {
if (!vis[j] && mp.count(j) == 0) {
dfs(j);
cnt1++;
}
}
int y = cnt1;
if (i == n) {
cout << "City " << a[i] << " is lost." << "\n";
cout << "Game Over." << "\n";
return ;
}
if (cnt1 > cnt) {
cout << "Red Alert: City " << a[i] << " is lost!" << "\n";
} else {
cout << "City " << a[i] << " is lost." << "\n";
}
cnt = cnt1;
}
}
int32_t main() {
int t = 1;
//cin >> t;
while (t--) {
solve();
}
}
7-11 病毒溯源
题意:
给你一些病毒衍生情况,让你去找到,衍生种类最多的那一个变化情况
思路:
直接从源病毒开始dfs,找到长度最长的链
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 1e5 + 10;
vector<int> v[N];
vector<int> ans;
int pre[N];
void dfs(int x, int dep) {
if (v[x].size() == 0 && dep > ans.size()) {
ans.clear();
int y = x;
while (y != -1) {
ans.push_back(y);
y = pre[y];
}
return ;
}
for (int i = 0; i < v[x].size(); i++) {
int j = v[x][i];
pre[j] = x;
dfs(j, dep + 1);
}
}
void solve() {
int n;
cin >> n;
int k, x, m;
map<int, int> mp;
for (int i = 0; i < n; i++) {
cin >> k;
for (int j = 0; j < k; j++ ) {
cin >> x;
v[i].push_back(x);
mp[x] = i;
}
}
for (int i = 0; i < n; i++) {
if (mp.count(i) == 0) {
m = i;
break;
}
}
for (int i = 0; i < n; i++) {
sort(v[i].begin(), v[i].end());
}
pre[m] = -1;
dfs(m, 1);
cout << ans.size() << "\n";
cout << ans[ans.size() - 1];
for (int i = ans.size() - 2; i >= 0; i--) {
cout << " " << ans[i];
}
}
int32_t main() {
int t = 1;
//cin >> t;
while (t--) {
solve();
}
}