Find the nearest clone

  • + 0 comments

    C# .NET Solution:

    Be sure to change the boilerplate code to this:

    long[] ids = Array.ConvertAll(Console.ReadLine().Trim().Split(' '), idsTemp => Convert.ToInt64(idsTemp))
            ;
    

    Solution code:

    static int findShortest(int graphNodes, int[] graphFrom, int[] graphTo, long[] ids, int val)
    {
        // solve here
        Dictionary<int, HashSet<int>> Adj = new Dictionary<int, HashSet<int>>();
        for(int i=1; i <= graphNodes; i++)
            Adj[i] = new HashSet<int>();
    
        for(int i=0; i<graphFrom.Length; i++)
        {
            Adj[graphFrom[i]].Add(graphTo[i]);
            Adj[graphTo[i]].Add(graphFrom[i]);
        }
    
        HashSet<int> requiredNodes = new HashSet<int>();
        Dictionary<int, int> distanceTo = new Dictionary<int, int>();
    
        for(int i=1; i<=graphNodes; i++)
            if(ids[i-1] == val)
                requiredNodes.Add(i);
    
        Queue<int> q;
        int minimumDistance = int.MaxValue;
        int distance;
        foreach(int node in requiredNodes)
        {
            q = new Queue<int>();
            distanceTo = new Dictionary<int, int>();
            distance = 1;
            q.Enqueue(node);
            distanceTo[node] = 0;
    
            while(q.Count != 0)
            {
                int cur = q.Dequeue();
                foreach(int n in Adj[cur])
                {
                    if(!distanceTo.ContainsKey(n))
                    {
                        q.Enqueue(n);
                        distanceTo[n] = distance;
                    }
                }
                distance++;
                foreach(var n in requiredNodes.Where(a => a != cur && a != node))
                    if(distanceTo.ContainsKey(n))
                        if(distanceTo[n]<minimumDistance)
                            minimumDistance = distanceTo[n];
            }
        }
    
        if(minimumDistance == int.MaxValue)
            return -1;
        else
            return minimumDistance;
    }