Jumbo – Omówienie zadania

Szczegółowe omówienie zadania Jumbo:

Link do powyższego omówienia zadania Jumbo:
https://youtu.be/I_Dr_vEnt2A?t=2950

Link do treści zadania Jumbo:
https://ki.staszic.waw.pl/task.php?name=jumbo

——-
Zadanie Jumbo pokazuje technikę preorder i postorder w drzewie:
https://youtu.be/I_Dr_vEnt2A?t=3560
——-

Jak się uczyć na podstawie tego zadania?
https://youtu.be/QgLyXYmFQeU?t=2019
Pamiętaj by zajrzeć max 1 raz – wtedy się rozwijasz:
https://youtu.be/pkLXuuOe_qA?t=3625

——-

Zadanie omawia Michał Szeliga – laureat Olimpiady Informatycznej Juniorów:
https://youtu.be/OA8BeVFvaNU?t=830

——-

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> sas[100000];
int pre[100000];
int post[100000];
bool vis[100000]; //Czy odwiedzony?
int krzykniecie = 0;
void DFS(int v){
vis[v] = 1;
pre[v] = ++krzykniecie; //Zwiększ krzyknięcie o 1, ustaw pre[v] na krzyknięcie
for (int u : sas[v]){
if (vis[u] == false){
DFS(u);
}
}
post[v] = ++krzykniecie;	
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for (int i = 1; i < n; i++){
int ojciec;
cin>>ojciec;
sas[ojciec].push_back(i);
sas[i].push_back(ojciec);
}
DFS(0);
while (true){
int a,b;
cin>>a;
if (a == -1) return 0;
cin>>b;
if (pre[a] < pre[b] && post[a] > post[b]) cout<<"TAK\n";
else cout<<"NIE\n";
}
}
Kod C++ programu Jumbo, który jest omówiony w powyższym filmie i który otrzymuje 100%
=============

Kod C++ Darii, uczestniczki naszych zajęć, który otrzymuje 100%:

Bardzo dziękuję za pomoc w trakcie zajęć!

#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5 + 6;
vector idole[MAX_N];
int preOrder[MAX_N];
int postOrder[MAX_N];
bool odwiedzone[MAX_N];
int pre = 0;
int post = 0;
void DFS(int start) {
pre++;
preOrder[start] = pre;
odwiedzone[start] = true;
for (int i : idole[start]) {
if (!odwiedzone[i]) {
DFS(i);
post++;
}
}
postOrder[start] = post;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
int a, b;
cin >> n;
int idol;
for (int i = 1; i < n; ++i) { cin >> idol;
idole[idol].push_back(i);
}
DFS(0);
while (true) {
cin >> a;
if (a == -1) {
break;
}
cin >> b;
if (preOrder[a] < preOrder[b] && postOrder[a] > postOrder[b]) {
cout << "TAK" << "\n";
} else {
cout << "NIE" << "\n";
}
}
return 0;
}

Nie dodano jeszcze komentarza, rozpocznij dyskusję pierwszy.

Dodaj komentarz