拓扑排序|bfs

lc1203

lc2684

拓扑排序,检查所有子序列能否 唯一 确定出一条拓扑序列

(入度为0,入队)若拓扑排序中任一环节q.size()>1 return false

class Solution

{

public:

bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences)

{

int n = nums.size();

vector<vector<int>> from(n + 1);

vector<int> inDegree(n + 1, 0);

for (vector<int>& v : sequences)

{

for (int i = 1; i < v.size(); i++) { // vi - 1 → vi

++fromv\[i - 1].push_back(vi);++

++inDegreev\[i]++;++

}

}

queue<int> zero;

for (int i = 1; i <= n; i++) {

if (inDegreei == 0) {

zero.push(i);

}

}

while (zero.size())

{

++if (zero.size() != 1)++

++return false;++

int thisFrom = zero.front();

zero.pop();

for (int& thisTo : fromthisFrom)

{

inDegreethisTo--;

++if (!inDegreethisTo) {++

++zero.push(thisTo);++

}

}

}

return true;

}

};

引入idx检验版

class Solution {

public:

bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {

int n = nums.size();

vector<vector<int>> from(n + 1);

vector<int> inDegree(n + 1, 0);

for (vector<int>& v : sequences) {

for (int i = 1; i < v.size(); i++) {

int u = vi - 1, v_node = vi;

fromu.push_back(v_node);

inDegreev_node++;

}

}

queue<int> zeroIn;

for (int i = 1; i <= n; i++) {

if (inDegreei == 0) {

zeroIn.push(i);

}

}

// 【新增】用于匹配nums的当前位置指针

int idx = 0;

while (!zeroIn.empty()) {

if (zeroIn.size() != 1) {

return false;

}

int curr = zeroIn.front();

zeroIn.pop();

// 【新增】判断当前拓扑节点是否与nums对应位置一致,不匹配则返回false

++if (idx >= n || curr != numsidx) {
return false;
}
++

// 【新增】匹配成功,移动指针到nums下一位

idx++;

for (int next : fromcurr) {

inDegreenext--;

if (inDegreenext == 0) {

zeroIn.push(next);

}

}

}

++return idx == n;
}
++

};

lc2684

简单多源bfs,第一列全入queue

class Solution {

typedef pair<int,int> pii;

vector<vector<bool>> vis;

public:

int maxMoves(vector<vector<int>>& grid)

{

int m=grid.size(),n=grid0.size();

queue<pii> q;

vis.resize(m,vector<bool>(n,false));

for(int i=0;i<m;i++)

{

q.push({i,0});

}

int dep=-1;

while(q.size())

{

int sz=q.size();

dep++;

while(sz--)

{

auto a,b=q.front();

q.pop();

if(b==n-1)

return n-1;

for(int i=-1;i<=1;i++)

{

int x=a+i;

int y=b+1;

if(x>=0 && x<m)

{

if(!visxy && gridxy>gridab)

{

q.push({x,y});

visxy=true;

}

}

}

}

}

return dep;

}

};

拓扑排序

lc1462

拓扑排序构建课程间的前置关系

传递闭包( ok 数组)

进而快速查询每对课程中前者是否为后者的前置课程,并返回查询结果。
闭包

传递闭包就是把"间接关系"补全的"关系表",比如++A→B、B→C,它就会记下A→C++,让所有能间接关联的都直接显出来。

class Solution {

public:

vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries)

{

vector<vector<int>> g(numCourses); //边数组

vector<int> ind(numCourses); //入度数组

for(auto& e: prerequisites)

{

int x = e0, y=e1;

gx.push_back(y);

indy++;

}

queue<int> q;

//入度为0的入队

for(int i=0;i<numCourses;i++)

{

if(indi == 0)

{

q.push(i);

}

}

//需要维护一个数组,相邻两个点是否能相互到达

vector ok(numCourses,vector<bool>(numCourses,false));

//进行拓扑序

vector<bool> ans; //保存答案

while(!q.empty())

{

int u = q.front();

q.pop();

/++/遍历临接点++

++for(int v : gu)++

{

/++/u--v之间能相互到达++

++okuv =true;++

for(int i=0;i<numCourses;i++)

{

++okiv = okiv | okiu;++

}

++indv--;++

if(indv == 0)

{

q.push(v);

}

}

}

//对查询进行解析

for(auto& qy : queries)

{

++ans.push_back(okqy\[0]qy\[1]);++

}

return ans;

}

};