有向图的遍历
1、找到小镇的法官
在一个小镇有N个人,其中一个是法官,在这些人中,所有人都相信法官,但是法官谁都不信,请找出这个法官,如果没有返回 -1
思路:其实这是一个入度和出度的个数,如果一个点入度个数为 N-1,则返回这个点,否则返回 -1
int findJudge(int N, vector<vector<int>>& trust) {
vector<int>res(1001,0);
for(auto e:trust){
res[e[1]]++;
res[e[0]]--;
}
for(int i = 1;i<=N;++i){
if(res[i] == N-1){
return i;
}
}
return -1;
}
2、找到最终的安全状态
在有向图中,沿着一个节点的有向边走,如果它走到尽头,则说明是安全节点,否则是不安全的,要求:返回一个有向图的安全节点数组
思路
1、找到入度为0的节点,它一定是安全的
2、然后对安全节点的入度节点进行判断,如果入度节点的出度数为1,则说明一定是安全的
数据结构:队列用来保存出度为0的节点,以及入度为1的节点,在队列中的每个节点都是安全的,所以需要建立哈希映射,最后通过哈希表来组成安全节点的数组
vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
// graph 表示每一个点的出度点
int N=graph.size();
//原图:各个点出度数组
vector<int>degree(N,0);
//逆图,rev 和 graph 是相反的
// graph 表示第 i 个节点的出度节点是 graph[i]
// rev 表示的是第 i 个节点的入度节点是 rev[i]
vector<vector<int>>rev(N,vector<int>(0));
for(int i=0;i<N;i++){
degree[i]=graph[i].size();
for(auto j:graph[i]){
rev