สมมติว่ามีทั้งหมด n หลักสูตรที่เราสามารถทำได้ หลักสูตรจะมีป้ายกำกับตั้งแต่ 0 ถึง n-1
บางหลักสูตรอาจมีข้อกำหนดเบื้องต้นโดยตรง เช่น ในหลักสูตร 0 เราต้องเรียนหลักสูตร 1 ก่อน ซึ่งแสดงเป็นคู่ [1,0]
ดังนั้น หากเรามีหลักสูตรจำนวนหนึ่ง n รายการคู่ข้อกำหนดเบื้องต้นโดยตรงและรายการคู่คำค้นหา
คุณควรหาคำตอบสำหรับคำถามแต่ละข้อ[i] ไม่ว่าหลักสูตรจะสอบถาม[i][0] เป็นข้อกำหนดเบื้องต้นของคำถามในหลักสูตร[i][1] หรือไม่ สุดท้าย เราต้องส่งคืนรายการบูลีน คำตอบสำหรับข้อความค้นหาที่กำหนด
เราต้องจำไว้ว่าถ้าหลักสูตร a เป็นข้อกำหนดเบื้องต้นของหลักสูตร b และหลักสูตร b เป็นข้อกำหนดเบื้องต้นของหลักสูตร c แล้ว หลักสูตร a เป็นข้อกำหนดเบื้องต้นของหลักสูตร c.
ดังนั้น หากอินพุตเป็น n =3 ข้อกำหนดเบื้องต้น =[[1,2],[1,0],[2,0]], การสืบค้น =[[1,0],[1,2]] แล้ว ผลลัพธ์จะเป็น [จริง,จริง]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ไม่มี :=110
-
กำหนดอาร์เรย์ ret
-
กำหนดหนึ่งแผนที่ใน
-
สำหรับแต่ละองค์ประกอบใน v ทำ
-
ใส่มัน[1] ที่ท้ายกราฟ[it[0]]
-
(เพิ่มขึ้นใน[มัน[1]] โดย 1)
-
-
กำหนดหนึ่งคิว q
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ถ้าใน[i] เท่ากับ 0 แล้ว −
-
แทรก i ลงใน q
-
-
-
กำหนด idx ของแผนที่หนึ่งรายการ
-
สำหรับการเริ่มต้น lvl :=1 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1) ทำ -
-
sz :=ขนาดของ q
-
ในขณะที่ sz ไม่ใช่ 0, ลด sz ในการวนซ้ำแต่ละครั้ง ให้ทำ -
-
โหนด :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
สำหรับแต่ละองค์ประกอบในกราฟ[โหนด]
-
(ลดลงใน[มัน] โดย 1)
-
สำหรับแต่ละองค์ประกอบ x ใน c[โหนด] ทำ
-
แทรก x ลงใน c[it]
-
-
แทรกโหนดลงใน c[it]
-
ถ้าใน[it] เท่ากับ 0 แล้ว −
-
แทรกลงใน q
-
-
-
-
-
สำหรับแต่ละองค์ประกอบใน x ทำ
-
แทรก (ความถี่ของมัน[0] ใน c[it[1]]) ที่ส่วนท้ายของ ret
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<bool> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
const int N = 110;
class Solution {
public:
vector <int> graph[N];
map <int, set <int>> c;
vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& v, vector<vector<int>>& x) {
vector<bool> ret;
map<int, int> in;
for (auto& it : v) {
graph[it[0]].push_back(it[1]);
in[it[1]]++;
}
queue<int> q;
for (int i = 0; i < n; i++) {
if (in[i] == 0)
q.push(i);
}
map<int, int> idx;
for (int lvl = 1; !q.empty(); lvl++) {
int sz = q.size();
while (sz--) {
int node = q.front();
q.pop();
for (auto& it : graph[node]) {
in[it]--;
for (auto& x : c[node])
c[it].insert(x);
c[it].insert(node);
if (in[it] == 0) {
q.push(it);
}
}
}
}
for (auto& it : x) {
ret.push_back(c[it[1]].count(it[0]));
}
return ret;
}
};
main(){
Solution ob;
vector<vector<int>> prerequisites = {{1,2},{1,0},{2,0}}, queries = {{1,0},{1,2}};
print_vector(ob.checkIfPrerequisite(3, prerequisites, queries));
} อินพุต
3, {{1,2},{1,0},{2,0}}, {{1,0},{1,2}} ผลลัพธ์
[1, 1, ]