查找图中两个顶点之间的边数

时间:2021-05-30 15:20:21

标签: c# graph breadth-first-search

我正在尝试执行一项练习任务,该任务需要查找图中两个顶点之间的边数。我正在练习平台上针对一些测试测试我的代码(我不知道测试)。其中一项测试失败了。你能帮我找出我的代码有什么问题吗,可能是我看不到某些极端情况或其他东西。

任务
查找两个顶点之间的边数。
给定
我们有 N 个坐标对的输入。每个坐标对都连接到所有其他坐标对。 我们有可到达顶点的 MaxWeight。 以及一个基于 1 的开始和结束索引。

所以我用顶点和边创建了图形,计算了距离(权重),并做了 bfs 但它仍然说对于某些测试有一个错误的答案。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (StreamReader reader = File.OpenText("input.txt"))
            {
                int verteciesAmount = int.Parse(reader.ReadLine());
                Graph graph = new Graph();
                for (int i = 0; i < verteciesAmount; i++)
                {
                    string coordinates = reader.ReadLine();
                    string[] coordinateValues = coordinates.Split(' ');
                    graph.AddVertex(new Vertex(int.Parse(coordinateValues[0]), int.Parse(coordinateValues[1]), i));
                }

                int maxDistance = int.Parse(reader.ReadLine());
                graph.InitEdges(maxDistance);
                string[] tripRoute = reader.ReadLine().Split(' ');
                int startVertexIndex = int.Parse(tripRoute[0]) - 1;
                int destinationVertexIndex = int.Parse(tripRoute[1]) - 1;
                int result = graph.FindRoute(startVertexIndex, destinationVertexIndex);
                Console.WriteLine(result);
                Console.ReadLine();
            }
        }
    }

    class Vertex
    {
        protected bool Equals(Vertex other)
        {
            return X == other.X && Y == other.Y;
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != this.GetType()) return false;
            return Equals((Vertex)obj);
        }

        public override int GetHashCode()
        {
            unchecked
            {
                return (X * 397) ^ Y;
            }
        }

        public Vertex(int x, int y, int index)
        {
            X = x;
            Y = y;
            Index = index;
        }

        public int X { get; set; }
        public int Y { get; set; }
        public int Index { get; set; }

        public int GetDistanceTo(Vertex vertex)
        {
            return Math.Abs(X - vertex.X) + Math.Abs(Y - vertex.Y);
        }

        public override string ToString()
        {
            return Index.ToString();
        }
    }

    class Edge
    {
        public Edge(Vertex from, Vertex to, int weight)
        {
            From = from;
            To = to;
            Weight = weight;
        }

        public Vertex From { get; set; }
        public Vertex To { get; set; }
        public int Weight { get; set; }

        public override string ToString()
        {
            return $"{From.Index}, {To.Index}";
        }
    }

    class Graph
    {
        private List<Vertex> Vertices { get; }
        private List<Edge> Edges { get; }

        public Graph()
        {
            Vertices = new List<Vertex>();
            Edges = new List<Edge>();
        }

        private List<Vertex> GetAvailableVertices(Vertex vertex)
        {
            List<Vertex> result = new List<Vertex>();
            foreach (Edge edge in Edges)
            {
                if (edge.From == vertex)
                {
                    result.Add(edge.To);
                }
            }

            return result;
        }

        public void AddVertex(Vertex vertex)
        {
            Vertices.Add(vertex);
        }

        private void AddEdge(Edge edge)
        {
            Edges.Add(edge);
        }
        
        public void InitEdges(int maxWeight)
        {
            foreach (Vertex vertexFrom in Vertices)
            {
                foreach (Vertex vertexTo in Vertices.Where(vertex => vertex != vertexFrom))
                {
                    var distance = vertexFrom.GetDistanceTo(vertexTo);
                    if (distance <= maxWeight)
                    {
                        AddEdge(new Edge(vertexFrom, vertexTo, distance));
                    }
                }
            }
        }

        public int FindRoute(int startCityIndex, int destinationCityIndex)
        {
            Vertex from = Vertices[startCityIndex];
            Vertex to = Vertices[destinationCityIndex];

            var result = new Dictionary<Vertex, int>();
            Queue<Vertex> visited = new Queue<Vertex>();
            visited.Enqueue(from);
            result[from] = 0;
            while (visited.Count > 0)
            {
                Vertex vertex = visited.Dequeue();
                var vertexLevel = result[vertex];
                foreach (Vertex availableVertex in GetAvailableVertices(vertex))
                {
                    if (result.ContainsKey(availableVertex))
                    {
                        continue;
                    }
                    else
                    {
                        visited.Enqueue(availableVertex);
                        result[availableVertex] = vertexLevel + 1;
                    }
                }
            }

            int resultLevel;
            if (result.TryGetValue(to, out resultLevel))
            {
                return resultLevel;
            }
            else
            {
                return -1;
            }
        }
    }
}

0 个答案:

没有答案