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 可能包含环。
  1. 输入:edges = [2,2,3,-1], node1 = 0, node2 = 1
    输出:2
    解释:从节点 0 到节点 2 的距离为 1 ,从节点 1 到节点 2 的距离为 1 。
    两个距离的较大值为 1 。我们无法得到一个比 1 更小的较大值,所以我们返回节点 2 。

  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;
    }
};
posted @ 2022-07-31 15:35  Vijurria  阅读(41)  评论(0编辑  收藏  举报