lc 6134. 找到离给定两个节点最近的节点(dfs)
https://leetcode.cn/contest/weekly-contest-304/problems/find-closest-node-to-given-two-nodes/
注意这题是有向图
给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,每个节点 至多 有一条出边。
有向图用大小为 n 下标从 0 开始的数组 edges 表示,表示节点 i 有一条有向边指向 edges[i] 。如果节点 i 没有出边,那么 edges[i] == -1 。
同时给你两个节点 node1 和 node2 。
请你返回一个从 node1 和 node2 都能到达节点的编号,使节点 node1 和节点 node2 到这个节点的距离 较大值最小化。如果有多个答案,请返回 最小 的节点编号。如果答案不存在,返回 -1 。
注意 edges 可能包含环。
-
输入:edges = [2,2,3,-1], node1 = 0, node2 = 1
输出:2
解释:从节点 0 到节点 2 的距离为 1 ,从节点 1 到节点 2 的距离为 1 。
两个距离的较大值为 1 。我们无法得到一个比 1 更小的较大值,所以我们返回节点 2 。 -
输入:edges = [1,2,-1], node1 = 0, node2 = 2
输出:2
解释:节点 0 到节点 2 的距离为 2 ,节点 2 到它自己的距离为 0 。
两个距离的较大值为 2 。我们无法得到一个比 2 更小的较大值,所以我们返回节点 2 。
爆搜
const int N=200200;
const int INF=0x3f3f3f3f;
int dist1[N],dist2[N];
int to[N];
void dfs1(int u,int dep)
{
dist1[u]=dep;
if(to[u]!=-1&&dist1[to[u]]==INF)//如果没有走到终点并且距离还是无穷大的时候
dfs1(to[u],dep+1);//就从这里往下继续走
}
void dfs2(int u,int dep)
{
dist2[u]=dep;
if(to[u]!=-1&&dist2[to[u]]==INF)
dfs2(to[u],dep+1);
}
class Solution {
public:
int closestMeetingNode(vector<int>& edges, int node1, int node2) {
int n=edges.size();
for(int i=0;i<n;i++)
{
//有向图,从i这个顶点可以指向另一个顶点
to[i]=edges[i];
//初始化距离都是正无穷
dist1[i]=INF;
dist2[i]=INF;
}
//从两个出发点分别开始查找
//到达的点,初始时候的深度
dfs1(node1,0);
dfs2(node2,0);
int minn=INF,idx=-1;
for(int i=0;i<n;i++)
{
int val=max(dist1[i],dist2[i]);
if(val<minn)
{
minn=val;
idx=i;
}
}
return idx;
}
};