问题描述
我正在尝试执行一项练习任务,该任务需要查找图中两个顶点之间的边数。我正在练习平台上针对一些测试测试我的代码(我不知道测试)。其中一项测试失败了。你能帮我找出我的代码有什么问题吗,可能是我看不到某些极端情况或其他东西。
任务:
查找两个顶点之间的边数。
给定:
我们有 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;
}
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)