hello-algo/codes/csharp/chapter_graph/graph_adjacency_list.cs
ZJKung f0b092fec4
Add C# code for the chapter Heap and Graph (#324)
* add : C# heap ,graph, fix type "sift"=>"shift"

* chore: rename "shift" to "sift"

* add: heap,graph C# sample code ,fix format

* fix md format

* fix md intend foramt

* fix basic_operation_of_graph.md format

* fix md format

* fix md format

* fix indentation format

* chore: fix my_heap.cs test

* fix: test and doc typo

* fix bug for commit 5eae708 (#317)

* Add Zig code blocks.

* fix: resolve build error for commit 5eae708 (#318)

* Unify the function naming of
queue from `offer()` to `push()`

* Update TypeScript codes.

* Update binary_search_tree

* Update graph operations.

* Fix code indentation.

* Update worst_best_time_complexity,
leetcode_two_sum

* Update avl_tree

* copy zig codes of chapter_array_and_linkedlist and chapter_computatio… (#319)

* copy zig codes of chapter_array_and_linkedlist and chapter_computational_complexity to markdown files

* Update time_complexity.md

---------

Co-authored-by: Yudong Jin <krahets@163.com>

* Fix Python code styles.
Update hash_map.

* chore: fix heap logic

* Update graph_adjacency_matrix.cs

* Update graph_adjacency_matrix.cs

* Update my_heap.cs

* fix: heap test

* fix naming format

* merge markdown

* fix markdown format

* Update graph_adjacency_list.cs

* Update graph_adjacency_matrix.cs

* Update PrintUtil.cs

* Create Vertex.cs

* Update heap.cs

---------

Co-authored-by: zjkung1123 <zjkung1123@fugle.tw>
Co-authored-by: sjinzh <99076655+sjinzh@users.noreply.github.com>
Co-authored-by: Yudong Jin <krahets@163.com>
Co-authored-by: nuomi1 <nuomi1@qq.com>
2023-02-15 21:24:24 +08:00

133 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* File: graph_adjacency_list.cs
* Created Time: 2023-02-06
* Author: zjkung1123 (zjkung1123@gmail.com)
*/
using hello_algo.include;
using NUnit.Framework;
namespace hello_algo.chapter_graph;
/* 基于邻接表实现的无向图类 */
class GraphAdjList
{
// 邻接表 adjList 中的元素是 Vertex 对象
Dictionary<Vertex, List<Vertex>> adjList;
/* 构造函数 */
public GraphAdjList(Vertex[][] edges)
{
this.adjList = new Dictionary<Vertex, List<Vertex>>();
// 添加所有顶点和边
foreach (Vertex[] edge in edges)
{
addVertex(edge[0]);
addVertex(edge[1]);
addEdge(edge[0], edge[1]);
}
}
/* 获取顶点数量 */
public int size()
{
return adjList.Count;
}
/* 添加边 */
public void addEdge(Vertex vet1, Vertex vet2)
{
if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)
throw new InvalidOperationException();
// 添加边 vet1 - vet2
adjList[vet1].Add(vet2);
adjList[vet2].Add(vet1);
}
/* 删除边 */
public void removeEdge(Vertex vet1, Vertex vet2)
{
if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)
throw new InvalidOperationException();
// 删除边 vet1 - vet2
adjList[vet1].Remove(vet2);
adjList[vet2].Remove(vet1);
}
/* 添加顶点 */
public void addVertex(Vertex vet)
{
if (adjList.ContainsKey(vet))
return;
// 在邻接表中添加一个新链表
adjList.Add(vet, new List<Vertex>());
}
/* 删除顶点 */
public void removeVertex(Vertex vet)
{
if (!adjList.ContainsKey(vet))
throw new InvalidOperationException();
// 在邻接表中删除顶点 vet 对应的链表
adjList.Remove(vet);
// 遍历其它顶点的链表,删除所有包含 vet 的边
foreach (List<Vertex> list in adjList.Values)
{
list.Remove(vet);
}
}
/* 打印邻接表 */
public void print()
{
Console.WriteLine("邻接表 =");
foreach (KeyValuePair<Vertex, List<Vertex>> entry in adjList)
{
List<int> tmp = new List<int>();
foreach (Vertex vertex in entry.Value)
tmp.Add(vertex.Val);
Console.WriteLine(entry.Key.Val + ": [" + string.Join(", ", tmp) + "],");
}
}
}
public class graph_adjacency_list
{
[Test]
public void Test()
{
/* 初始化无向图 */
Vertex[] v = Vertex.valsToVets(new int[] { 1, 3, 2, 5, 4 });
Vertex[][] edges = new Vertex[][] { new Vertex[] { v[0], v[1] }, new Vertex[] { v[0], v[3] },
new Vertex[] { v[1], v[2] }, new Vertex[] { v[2], v[3] },
new Vertex[] { v[2], v[4] }, new Vertex[] { v[3], v[4] } };
GraphAdjList graph = new GraphAdjList(edges);
Console.WriteLine("\n初始化后图为");
graph.print();
/* 添加边 */
// 顶点 1, 2 即 v[0], v[2]
graph.addEdge(v[0], v[2]);
Console.WriteLine("\n添加边 1-2 后,图为");
graph.print();
/* 删除边 */
// 顶点 1, 3 即 v[0], v[1]
graph.removeEdge(v[0], v[1]);
Console.WriteLine("\n删除边 1-3 后,图为");
graph.print();
/* 添加顶点 */
Vertex v5 = new Vertex(6);
graph.addVertex(v5);
Console.WriteLine("\n添加顶点 6 后,图为");
graph.print();
/* 删除顶点 */
// 顶点 3 即 v[1]
graph.removeVertex(v[1]);
Console.WriteLine("\n删除顶点 3 后,图为");
graph.print();
}
}