-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBellmanFord.cpp
155 lines (110 loc) · 2.95 KB
/
BellmanFord.cpp
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// bagli liste yapisi ile graph larda belman-ford ile en kisa yol bulma algoritmasi
// Ahmet Furkan DEMIR
#include <stdio.h>
#include <stdlib.h>
#include <list>
using namespace std;
// node sayisi (vertex)
#define count 6
// komsulari tutan yapi (komsu vertexler)
typedef struct queue{
int id;
int weight;
struct queue *next;
}queue;
// nodelerin hepsini tutan yapi
typedef struct Node{
// list yapisi vertexlerin hepsini tutacak
struct queue *list[count];
}node;
// ana yapiya erisilen yer
node * root;
// root init
void __init__(){
root=(node *)malloc(sizeof(node));
}
// dugumleri (vertexleri) birbirine bagladigimiz yer, edge ler olusturdugumuz yer
// v den w ye baglanti gerceklesir, agirliklar (weight) ise komsular arasi mesafe
void addEdge(int v, int w, int value){
// ilk komsu eklenir
if(root->list[v]==NULL){
root->list[v]=(queue *)malloc(sizeof(queue));
root->list[v]->weight=value;
root->list[v]->id=w;
root->list[v]->next=NULL;
}
// diger komsular eklenir
else{
queue *temp=root->list[v];
while(temp->next!=NULL){
temp=temp->next;
}
temp->next=(queue *)malloc(sizeof(queue));
temp->next->weight=value;
temp->next->id=w;
temp->next->next=NULL;
}
}
// dist dizisi ekrana print edilir
// bu dizi ana vertexe olan uzaklıkları tutar
void print(int dist[])
{
printf("Vertex Shortest distance\n");
for (int i = 0; i < count; ++i){
printf("%d \t\t %d\n", i, dist[i]);
}
}
// belman-ford algoritmasi
void BellmanFord(int s) {
// ana vertexe uzakligi tutacak olan dizi
int dist[count];
// max deger atiyoruz, cunki kucukmu diye karsilastirip yeni deger atamasi yapacagiz
for (int i = 0; i < count; i++){
dist[i] = 999;
}
// baslangic vertex = 0
dist[s] = 0;
// tum vertexlerimize sırayla ilerleyecegiz
for (int i = 0; i < count; i++) {
// verteximizin komsularini dolasacagiz
queue *temp= root->list[i];
while(temp!=NULL){
// u = suanki vertex
int u = i;
// hedef (komsu) vertex
int v = temp->id;
// uzaklik yani weight
int weight = temp->weight;
// eger kucuk ise mevcut dist guncellenir ve yeni en kısa mesefa bu guncelleme olur
// eger buyuk ise herhangi bir guncellemeye gerek kalmaz.
if (dist[u] != 999 && dist[u] + weight < dist[v]){
dist[v] = dist[u] + weight;
}
// sonraki komsu vertexe gecilir
temp=temp->next;
}
}
// mesefe print edilir
print(dist);
}
// main
int main()
{
// init ve ekleme islemi
__init__();
addEdge(0, 1, 8);
addEdge(0, 2, 1);
addEdge(1, 5, -3);
addEdge(1, 3, 4);
addEdge(2, 3, 2);
addEdge(2, 4, 5);
addEdge(3, 2, 8);
addEdge(3, 4, 6);
addEdge(4, 3, 1);
addEdge(4, 5, 3);
addEdge(4, 1, -6);
addEdge(5, 4, -2);
// algoritma
BellmanFord(0);
return 0;
}