Repository navigation
Expand file tree
/
Copy pathGraphMatrix.cs
More file actions
119 lines (104 loc) · 3.09 KB
/
Copy pathGraphMatrix.cs
File metadata and controls
119 lines (104 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System.Collections.Generic;
using System.Linq;
namespace Code.Graph;
/// <summary>
/// Graph represented as a matrix
/// </summary>
public class GraphMatrix<T>
{
private readonly bool directed;
private readonly bool weighted;
private List<T> VertexList;
private int[,] Matrix;
/// <summary>
/// Initialize graph with vertex list.
/// </summary>
/// <param name="vertexList"></param>
/// <param name="directed"></param>
/// <param name="weighted"></param>
public GraphMatrix(T[] vertexList, bool directed = false, bool weighted = false)
{
this.directed = directed;
this.weighted = weighted;
VertexList = vertexList.ToList();
Matrix = new int[vertexList.Length, vertexList.Length];
}
/// <summary>
/// Add an edge to the graph.
/// </summary>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <param name="weight"></param>
public void AddEdge(int startIndex, int endIndex, int weight = 1) {
int edgeWeight = weighted ? weight : 1;
Matrix[startIndex, endIndex] = edgeWeight;
if (!directed) {
Matrix[endIndex, startIndex] = edgeWeight;
}
}
/// <summary>
/// Remove an edge from the graph.
/// </summary>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
public void RemoveEdge(int startIndex, int endIndex) {
Matrix[startIndex, endIndex] = 0;
if (!directed) {
Matrix[endIndex, startIndex] = 0;
}
}
/// <summary>
/// Add a vertex to the graph.
/// </summary>
/// <param name="vertex"></param>
public void AddVertex(T vertex) {
VertexList.Add(vertex);
int[,] newMatrix = new int[VertexList.Count, VertexList.Count];
for (int i = 0; i < Matrix.GetLength(0); i++) {
for (int j = 0; j < Matrix.GetLength(1); j++) {
newMatrix[i, j] = Matrix[i, j];
}
}
Matrix = newMatrix;
}
/// <summary>
/// Remove a vertex from the graph.
/// </summary>
/// <param name="vertex"></param>
public void RemoveVertex(T vertex) {
int indexToRemove = VertexList.IndexOf(vertex);
if(indexToRemove == -1) {
return;
}
VertexList.RemoveAt(indexToRemove);
int[,] newMatrix = new int[VertexList.Count, VertexList.Count];
int newRow = 0, newCol;
for (int i = 0; i < Matrix.GetLength(0); i++) {
if( i == indexToRemove) continue;
newCol = 0;
for (int j = 0; j < Matrix.GetLength(1); j++) {
if(j == indexToRemove) continue;
newMatrix[newRow, newCol] = Matrix[i, j];
newCol++;
}
newRow++;
}
Matrix = newMatrix;
}
public int[,] GetMatrix()
{
return Matrix;
}
public List<T> GetVertexList()
{
return VertexList;
}
public bool Directed()
{
return directed;
}
public bool Weighted()
{
return weighted;
}
}