mydiaz

Djikstra

Jun 5th, 2022 (edited)
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define M 100
  4. #define N 5
  5.  
  6. typedef int itemType;
  7. typedef struct {
  8.     itemType data[N];
  9.     int indeks;
  10. } stack;
  11.  
  12. typedef struct {
  13.     int count;
  14.     int front;
  15.     int rear;
  16.     itemType data[N];
  17. }queue;
  18.  
  19. void inisialisasiQueue(queue *);
  20. int empty_q(queue *);
  21. int full_q(queue *);
  22. void enqueue(itemType, queue *);
  23. itemType dequeue(queue *);
  24.  
  25. void inisialisasiStack(stack *);
  26. int empty_s(stack *);
  27. int full_s(stack *);
  28. void push(itemType, stack *);
  29. void push(itemType, stack *);
  30. itemType pop(stack *);
  31.  
  32. void djikstra();
  33. void inisialisasiTQ();
  34. void inisialisasiR();
  35. int ada(int, queue *);
  36. void baca_rute();
  37.  
  38. int QQ[][6]=
  39.     {{M,1,3,M,M,M},
  40.     {M,M,1,M,5,7},
  41.     {3,M,M, 2, M, M},
  42.     {M,M,M,M,1,M},
  43.     {M,4,M,M,M,2},
  44.     {M,M,M,M,M,M}};
  45.  
  46. int Q[][5]=
  47.     {{M, 1, 3, M, M},
  48.      {M, M, 1, M, 5},
  49.      {3, M, M, 2, M},
  50.      {M, M, M, M, 1},
  51.      {M, 4, M, M, M},
  52. };
  53. int TQ[N], R[N];
  54.  
  55. int asal, tuj;
  56. int main()
  57. {
  58.     int i;
  59.  
  60.     puts("Graph DJIKSTRA");
  61.     djikstra();
  62.     baca_rute();
  63.     printf("Matriks TQ : ");
  64.     for(i=0; i<N; i++)
  65.         printf("%d ", TQ[i]);
  66.     puts("");
  67.     printf("Matriks R : ");
  68.     for(i=0; i<N; i++)
  69.         printf("%d ", R[i]);
  70.     puts("");
  71.     return 0;
  72. }
  73.  
  74. void baca_rute(){
  75.     int tuj_asli;
  76.     stack tumpukan;
  77.  
  78.     inisialisasiStack(&tumpukan);
  79.     tuj_asli = tuj;
  80.     printf("\nRute dari %d ke %d = ", asal+1, tuj+1);
  81.     while(R[tuj] != -1) {
  82.         push(R[tuj], &tumpukan);
  83.         tuj = R[tuj];
  84.     }
  85.     //printf("%d - ", asal+1);
  86.     while(!empty_s(&tumpukan)) {
  87.         printf("%d - ", pop(&tumpukan)+1);
  88.     }
  89.     printf("%d\n", tuj_asli+1);
  90.  
  91.     printf("Total beban = %d\n", TQ[tuj_asli]);
  92. }
  93.  
  94. void djikstra(){
  95.     int i, cn;
  96.     queue antrian;
  97.  
  98.     printf("Masukkan asal : ");
  99.     scanf("%d", &asal);
  100.     asal--;
  101.     fflush(stdin);
  102.     printf("Masukkan tujuan : ");
  103.     scanf("%d", &tuj);
  104.     tuj--;
  105.     inisialisasiTQ();
  106.     inisialisasiR();
  107.     inisialisasiQueue(&antrian);
  108.     enqueue(asal, &antrian);
  109.     while(!empty_q(&antrian)){
  110.         cn = dequeue(&antrian);
  111.         i=0;
  112.         while(i<N){
  113.             if(Q[cn][i] != M){
  114.                 if(Q[cn][i] + TQ[cn] <TQ[i]){
  115.                     TQ[i] = Q[cn] [i] + TQ[cn];
  116.                     R[i] = cn;
  117.                 //  hsl = ada(i, &antrian);
  118.                     if(i!=asal && i!=tuj && !ada(i, &antrian))
  119.                         enqueue(i, &antrian);
  120.                 }
  121.  
  122.             }
  123.             i++;
  124.         }
  125.     }
  126. }
  127.  
  128. int ada(itemType x, queue *q){
  129.     int hsl=0, i;
  130.  
  131.     for(i=0; i<N; i++){
  132.         if(q->data[i] == x)
  133.             hsl=1;
  134.     }
  135.     return hsl;
  136. }
  137.  
  138. void inisialisasiR(){
  139.     int i;
  140.  
  141.     for(i=0; i<N; i++){
  142.         R[i] = -1;
  143.     }
  144. }
  145.  
  146. void inisialisasiTQ(){
  147.     int i;
  148.  
  149.     for(i=0; i<N; i++){
  150.         if(i==asal)
  151.             TQ[i] = 0;
  152.         else
  153.             TQ[i] = M;
  154.     }
  155. }
  156.  
  157. void inisialisasiQueue(queue *q){
  158.     q->count = 0;
  159.     q->front = 0;
  160.     q->rear = 0;
  161. }
  162.  
  163. int empty_q(queue *q){
  164.     if(q->count == 0)
  165.         return 1;
  166.     else
  167.         return 0;
  168. }
  169.  
  170. int full_q(queue *q){
  171.     if(q->count == N)
  172.         return 1;
  173.     else
  174.         return 0;
  175. }
  176.  
  177. void enqueue(itemType x, queue *q) {
  178.     if (full_q(q)) {
  179.         puts("\nSTOP!!!");
  180.         puts("Queue Penuh! Data terakhir Gak bs masuk!");
  181.     }
  182.     else {
  183.         q->data[q->rear] = x;
  184.  
  185.         q->rear = (q->rear + 1) % N;
  186.         ++(q->count);
  187.     }
  188. }
  189.  
  190. itemType dequeue(queue *q) {
  191.     itemType tampung;
  192.  
  193.     if(empty_q(q)) {
  194.         puts("\nTidak dapat mengambil data !");
  195.         puts("Queueu Kosong!\n");
  196.         tampung = ' ';
  197.     }
  198.     else {
  199.         tampung = q->data[q->front];
  200.  
  201.         q->front = (q->front + 1) % N;
  202.         --(q->count);
  203.     }
  204.     return tampung;   //data yang diambil dari posisi front
  205. }
  206.  
  207.  
  208.  
  209.  
  210. void inisialisasiStack(stack *s){
  211.     s->indeks = 0;
  212. }
  213.  
  214. int full_s (stack *s){
  215.     if(s->indeks == N)
  216.         return 1;
  217.     else
  218.         return 0;
  219. }
  220.  
  221. int empty_s(stack *s){
  222.     if(s->indeks == 0)
  223.         return 1;
  224.     else
  225.         return 0;
  226. }
  227.  
  228. void push(itemType x, stack *s){
  229. //  if(full_q (queue *q))
  230. //      puts("\nStack sudah penuh, data terakhir ga bs masuk!");
  231. //  else{
  232.         s->data[s->indeks] = x;
  233.         ++s->indeks;
  234. //  }
  235. }
  236.  
  237. itemType pop(stack *s){
  238.     itemType tampung;
  239.  
  240.     if(empty_s(s)) {
  241.         puts("Stack kosong, gak bisa ngambil data apapun");
  242.         tampung = ' ';
  243.     }
  244.     else {
  245.         --s->indeks;
  246.         tampung = s->data[s->indeks];
  247.     }
  248.     return tampung;
  249. }
  250.  
Add Comment
Please, Sign In to add comment