C# 中的 BFS 地图绘制
BFS Map-Drawing in C#
我如何在 C# 中的未加权、无向图中使用 BFS,使用 adj 列表来染色地图,使用四种颜色,以便 2 个相邻的国家具有不同的颜色。
这就是我实现图表的方式,我将添加一个将四种颜色表示为字符串的数组,另一个表示国家/地区的数组,例如每个顶点代表一个国家/地区。
internal class Graph
{
private int vertices;
private LinkedList<int>[] adj;
public Graph(int v)
{
vertices = v;
adj = new LinkedList<int>[v];
for(int i = 0; i < v; i++)
{
adj[i] = new LinkedList<int>();
}
}
public void addEdge(int c, int v)
{
adj[c].AddLast(v);
}
public void BFS(int s)
{
bool[] visited = new bool[vertices];
for(int i=0; i<vertices; i++)
{
visited[i] = false;
}
LinkedList<int> queue = new LinkedList<int>();
visited[s] = true;
queue.AddLast(s);
while (queue.Any())
{
s = queue.First();
Console.WriteLine(s + " ");
LinkedList<int> list = adj[s];
foreach(var val in list)
{
if (!visited[val])
{
visited[val] = true;
queue.AddLast(val);
}
}
}
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TrifIonut_MapDrawing
{
internal class Graph
{
private int vertices;
private LinkedList<int>[] adj;
private string[] color;
public Graph(int v)
{
vertices = v;
adj = new LinkedList<int>[v];
color = new string[v];
for (int i = 0; i < v; i++)
{
adj[i] = new LinkedList<int>();
color[i] = "";
}
color[0] = "blue";
}
public void addEdge(int c, int v)
{
adj[c].AddLast(v);
}
public void BFS(int s)
{
bool[] visited = new bool[vertices];
for (int i = 0; i < vertices; i++)
{
visited[i] = false;
}
LinkedList<int> queue = new LinkedList<int>();
visited[s] = true;
queue.AddLast(s);
while (queue.Any())
{
s = queue.First();
queue.RemoveFirst();
LinkedList<int> list = adj[s];
void visitor()
{
List<string> possibleColors = new List<string>{"blue", "green", "yellow", "red" };
foreach (var val in list)
{
if (visited[val])
{
for(int i=0; i<possibleColors.Count; i++)
{
if (color[val] == possibleColors[i])
{
possibleColors.RemoveAt(i);
}
}
}
}
color[s] = possibleColors[0];
}
visitor();
foreach (var val in list)
{
if (!visited[val])
{
visited[val] = true;
queue.AddLast(val);
}
}
}
}
}
}
我真的不知道如何修改 BFS 函数来帮助我解决问题。
您可以添加一个“访问者”,这是一个小函数,每次在搜索中到达一个新节点时都会调用该函数。将新访问节点的索引传递给访问者。在访问者中查看新节点的所有相邻节点。如果访问过相邻节点,则从可能的颜色中删除相邻节点的颜色。使用未被访问的相邻节点使用的颜色为新节点着色。
我如何在 C# 中的未加权、无向图中使用 BFS,使用 adj 列表来染色地图,使用四种颜色,以便 2 个相邻的国家具有不同的颜色。
这就是我实现图表的方式,我将添加一个将四种颜色表示为字符串的数组,另一个表示国家/地区的数组,例如每个顶点代表一个国家/地区。
internal class Graph
{
private int vertices;
private LinkedList<int>[] adj;
public Graph(int v)
{
vertices = v;
adj = new LinkedList<int>[v];
for(int i = 0; i < v; i++)
{
adj[i] = new LinkedList<int>();
}
}
public void addEdge(int c, int v)
{
adj[c].AddLast(v);
}
public void BFS(int s)
{
bool[] visited = new bool[vertices];
for(int i=0; i<vertices; i++)
{
visited[i] = false;
}
LinkedList<int> queue = new LinkedList<int>();
visited[s] = true;
queue.AddLast(s);
while (queue.Any())
{
s = queue.First();
Console.WriteLine(s + " ");
LinkedList<int> list = adj[s];
foreach(var val in list)
{
if (!visited[val])
{
visited[val] = true;
queue.AddLast(val);
}
}
}
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TrifIonut_MapDrawing
{
internal class Graph
{
private int vertices;
private LinkedList<int>[] adj;
private string[] color;
public Graph(int v)
{
vertices = v;
adj = new LinkedList<int>[v];
color = new string[v];
for (int i = 0; i < v; i++)
{
adj[i] = new LinkedList<int>();
color[i] = "";
}
color[0] = "blue";
}
public void addEdge(int c, int v)
{
adj[c].AddLast(v);
}
public void BFS(int s)
{
bool[] visited = new bool[vertices];
for (int i = 0; i < vertices; i++)
{
visited[i] = false;
}
LinkedList<int> queue = new LinkedList<int>();
visited[s] = true;
queue.AddLast(s);
while (queue.Any())
{
s = queue.First();
queue.RemoveFirst();
LinkedList<int> list = adj[s];
void visitor()
{
List<string> possibleColors = new List<string>{"blue", "green", "yellow", "red" };
foreach (var val in list)
{
if (visited[val])
{
for(int i=0; i<possibleColors.Count; i++)
{
if (color[val] == possibleColors[i])
{
possibleColors.RemoveAt(i);
}
}
}
}
color[s] = possibleColors[0];
}
visitor();
foreach (var val in list)
{
if (!visited[val])
{
visited[val] = true;
queue.AddLast(val);
}
}
}
}
}
}
我真的不知道如何修改 BFS 函数来帮助我解决问题。
您可以添加一个“访问者”,这是一个小函数,每次在搜索中到达一个新节点时都会调用该函数。将新访问节点的索引传递给访问者。在访问者中查看新节点的所有相邻节点。如果访问过相邻节点,则从可能的颜色中删除相邻节点的颜色。使用未被访问的相邻节点使用的颜色为新节点着色。