#include
#include
#include
#define MAX 1000
struct Node{
int n, weight;
}node; //struct untuk deklarasi type 'node' sehingga dapat memiliki attribut suatu titik
int flag[MAX], previ[MAX], dist[MAX], vertex, source, destination;
int graph[MAX][MAX];
std::vector vec_nodes;
void add(int N, int cost){
node.n = N;
node.weight = cost;
vec_nodes.push_back(node);
}
bool data_sort(Node a, Node b){
return a.weight < b.weight;
}
void UCS(){
for(int i = 1; i <= vertex; i++){ //Initiate value tiap penyimpanan
flag[i] = 0;
dist[i] = 10e9;
previ[i] = -1;
}
dist[source] = 0; //Value untuk source node (35 - 38)
previ[source] = -1;
add(source, 0);
while(!vec_nodes.empty()){
int u = vec_nodes[0].n;
vec_nodes.erase(vec_nodes.begin());
for(int i = 1; i <= vertex; i++){
if(graph[u][i] != 0 && flag[i] == 0){ //Node u dan i terhubung langsung oleh 1 garis
if(dist[u] + graph[u][i] < dist[i]){ //Kondisi untuk jika jaraknya lebih kecil maka kemungkinan akan menjadi hasil final
dist[i] = dist[u] + graph[u][i];
previ[i] = u;
}
add(i, dist[i]); //Add node i ke vector yang menyimpan jaraknya
sort(vec_nodes.begin(), vec_nodes.end(), data_sort); //Vector diurutkan sesuai prinsip UCS yang mengambil node dengan jarak terpendek dari root
}
}
flag[u] = -1; //Tanda bahwa titik tsb sudah ditemukan
}
}
void printPath(int destination){
if(destination == source)
printf("%d ", source);
else if(previ[destination] == -1)
return;
else{
printPath(previ[destination]);
printf("%d ", destination);
}
}
void printDistance(){
int i;
printf("\nDistance Measurement:\n");
for(i = 1; i <= vertex; ++i){
printf("%d -> %d = %d \n", source, i, dist[i]);
}
printf("\n");
}
int main(){
int edges, u, v, w;
printf("Enter number of edges: "); //Jumlah garis
scanf("%d", &edges);
vertex = -1;
printf("Enter %d edges (from-to-distance) each separated by a space:\n", edges);
for(int i = 0; i < edges; i++){ //Buat input data graf
scanf("%d %d %d", &u, &v, &w);
graph[u][v] = w;
vertex = std::max(u, std::max(v, vertex)); //Buat nyari jumlah vertex
}
printf("Enter source and destination: ");
scanf("%d %d", &source, &destination);
UCS(); //Algoritma utama Uniform-cost search
printDistance(); //Jarak terpendek source node ke semua titik
printf("The path from %d to %d is given below : \n", source, destination);
printPath(destination); //Untuk print jalur source node ke target node
return 0;
}