-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgraph.cpp
More file actions
135 lines (107 loc) · 2.6 KB
/
Copy pathgraph.cpp
File metadata and controls
135 lines (107 loc) · 2.6 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
128
129
130
131
132
133
134
135
#include "graph.h"
node* start = NULL;
node* find(int item) {
node* ptr = start;
while(ptr != NULL) {
if(ptr->name == item)
return ptr;
ptr = ptr->next;
}
return NULL;
}
void insert_node(int node_name) {
node* tmp = new node;
tmp->name = node_name;
tmp->next = NULL;
tmp->adj = NULL;
if(start == NULL) {
start = tmp;
return;
}
node* pt = start;
while(pt->next != NULL)
pt = pt->next;
pt->next = tmp;
}
void insert_edge(int u, int v, int weight) {
node* locu = find(u);
node* locv = find(v);
if(locu == NULL) {
cout << "Source node " << u << " not present. Insert it first.\n";
return;
}
if(locv == NULL) {
cout << "Destination node " << v << " not present. Insert it first.\n";
return;
}
Edge* tmp = new Edge;
tmp->dest = v;
tmp->weight = weight; // set weight
tmp->link = NULL;
if(locu->adj == NULL) {
locu->adj = tmp;
return;
}
Edge* ptr = locu->adj;
while(ptr->link != NULL)
ptr = ptr->link;
ptr->link = tmp;
}
void setDeliveryGraph(){
for (int i = 0; i < 6; ++i){
insert_node(i);
}
insert_edge(0, 1, 2);
insert_edge(0, 2, 3);
insert_edge(0, 3, 5);
insert_edge(0, 5, 4);
insert_edge(1, 0, 2);
insert_edge(1, 5, 1);
insert_edge(2, 0, 3);
insert_edge(2, 3, 1);
insert_edge(3, 0, 5);
insert_edge(3, 4, 2);
insert_edge(3, 5, 2);
insert_edge(3, 2, 1);
insert_edge(4, 3, 2);
insert_edge(4, 5, 2);
insert_edge(5, 0, 4);
insert_edge(5, 1, 1);
insert_edge(5, 3, 2);
insert_edge(5, 4, 2);
}
void dijkstra(int source, int dist[]) {
const int INF = INT_MAX;
const int MAX = 100;
int visited[MAX] = {0};
int nodes[MAX];
int count = 0;
node* ptr = start;
while(ptr != NULL) {
nodes[count++] = ptr->name;
ptr = ptr->next;
}
for (int i = 0; i < MAX; i++)
dist[i] = INF;
dist[source] = 0;
for (int i = 0; i < count; i++) {
int u = -1, minDist = INF;
for (int j = 0; j < count; j++) {
int node = nodes[j];
if (!visited[node] && dist[node] < minDist) {
minDist = dist[node];
u = node;
}
}
if (u == -1) break;
visited[u] = 1;
node* uNode = find(u);
Edge* e = uNode->adj;
while (e != NULL) {
int v = e->dest;
if (!visited[v] && dist[u] + e->weight < dist[v])
dist[v] = dist[u] + e->weight;
e = e->link;
}
}
}