-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWeightedGraph.cs
More file actions
127 lines (124 loc) · 4.43 KB
/
Copy pathWeightedGraph.cs
File metadata and controls
127 lines (124 loc) · 4.43 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
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace algoExersice
{
internal class WeightedGraph
{
int verticesCounter = 0;
int[,] adjacency;
Vertex[] vertexList;
public WeightedGraph(int numOfVertices)
{
adjacency = new int[numOfVertices, numOfVertices];
vertexList = new Vertex[numOfVertices];
}
public void InsertVertex(string name)
{
vertexList[verticesCounter] = new Vertex(name);
verticesCounter++;
}
public void InsertEdge(string source, string destination, int weight)
{
int sourceIndex = GetIndex(source);
int destinationIndex = GetIndex(destination);
if (sourceIndex == destinationIndex) { Console.WriteLine("Not a valid edge"); return; }
if (adjacency[sourceIndex, destinationIndex] != 0)
Console.WriteLine("Edge already exist");
else
adjacency[sourceIndex, destinationIndex] = weight;
}
public int GetIndex(string vertexString)
{
for (int i = 0; i < verticesCounter; i++)
if (vertexString == vertexList[i].name)
return i;
return -1;
}
public int[] Dijkstra(string start, string end)
{
priorityQueue pq = new priorityQueue(15);
int indexStart = GetIndex(start);
int indexEnd = GetIndex(end);
int[] path = new int[10];
NodePQ smallest;
int currentLength = -1,currentNodeIndex=0,pathCounter=0;
int[] distances = new int[10];
NodePQ[] previous =new NodePQ[10];
inititailizePath(path);
for (int i = 0; i < vertexList.Length; i++)
{
if (vertexList[i] != null)
{
if (vertexList[i].name == start)
{
pq.enqueue(vertexList[i].name, 0);
distances[i] = 0;
}
else
{
pq.enqueue(vertexList[i].name, 99999);
distances[i] = 99999;
}
}
}
while (pq.length != 0)
{
smallest = pq.dequeue();
if (smallest.value == end)
{
currentNodeIndex = GetIndex(smallest.value);
while (currentNodeIndex!=0)
{
path[pathCounter] = currentNodeIndex;
pathCounter++;
currentNodeIndex = GetIndex( previous[currentNodeIndex].value);
}
path[pathCounter] = currentNodeIndex;
path.Reverse();
return path;
}
if (smallest != null && distances[GetIndex(smallest.value)] != 99999)
{
int[] row = getRow(adjacency, GetIndex(smallest.value));
for (int i = 0; i < row.Length; i++)
{
currentLength = distances[GetIndex(smallest.value)] + row[i];
if (currentLength < distances[i]&& row[i] != 0)
{
distances[i] = currentLength;
previous[i] = smallest;
pq.enqueue(i+"", currentLength);
}
}
}
}
return null;
}
public string printPath(int[] path)
{
string result = "";
for(int i = path.Length-1; i>=0; i--)
{
if(path[i]!=-1)
result+=path[i]+" ";
}
return result;
}
public int[] getRow(int[,] arr,int row)
{
int[] result=new int[10];
for(int i = 0; i < 10; i++)
result[i] = arr[row,i];
return result;
}
public int[] inititailizePath(int[] path)
{
for (int i = 0; i < path.Length; i++)
path[i] = -1;
return path;
}
}
}