链接:
题意
一个pair<int,int>表示a是b的前置
进行n次查询,查询q是否是p的前置(可以不是直接前置)
解:
就是要把01、12、13这种能转换出02、03,弗洛伊德即可
无环无负权
实际代码:
#include<bits/stdc++.h>
using namespace std;
vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries)
{
vector<vector<int>>edges(numCourses+3,vector<int>(numCourses+3));
for(auto prerequisite:prerequisites) edges[prerequisite[0]][prerequisite[1]]=1;
for(int i=0;i<numCourses;i++)
{
for(int j=0;j<numCourses;j++)
{
if(edges[i][j]==0) edges[i][j]=0X3f3f3f3f;
}
}
for(int t=0;t<numCourses;t++)
{
for(int i=0;i<numCourses;i++)
{
for(int j=0;j<numCourses;j++)
{
if(edges[i][t]+edges[t][j]<edges[i][j])
{
edges[i][j]=1;
}
}
}
}
vector<bool>ans;
for(auto querie:queries)
{
if(edges[querie[0]][querie[1]]<0x3f3f3f3f) ans.push_back(true);
else ans.push_back(false);
}
return ans;
}
限制:
2 <= numCourses <= 100
0 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)
prerequisites[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
- 每一对
[ai, bi]
都 不同 - 先修课程图中没有环。
1 <= queries.length <= 104
0 <= ui, vi <= n - 1
ui != vi