কম্পিউটার টিউটোরিয়াল

C++-এ জনসন অ্যালগরিদম (Johnson's Algorithm) ইমপ্লিমেন্টেশন

এখানে আমরা দুটি ভার্টেক্সের মধ্যে সবচেয়ে ছোট পাথ (shortest path) বের করার জন্য জনসন অ্যালগরিদম (Johnson's Algorithm) দেখব।

C++-এ জনসন অ্যালগরিদম (Johnson s Algorithm) ইমপ্লিমেন্টেশন

C++-এ জনসন অ্যালগরিদম (Johnson s Algorithm) ইমপ্লিমেন্টেশন

গ্রাফটি এখানে দেওয়া আছে। এজগুলোর মধ্যে সবচেয়ে ছোট পাথ নিচের মতো। এই প্রোগ্রাম ভার্টেক্স সংখ্যা, এজ সংখ্যা, এবং তাদের কস্ট সহ এজগুলো ইনপুট হিসেবে নেবে।

ইনপুট - ভার্টেক্স: ৩

এজ: ৫

এজ ও কস্ট:

1 2 8

2 1 12

1 3 22

3 1 6

2 3 4

আউটপুট - গ্রাফের দূরত্ব ম্যাট্রিক্স (distance matrix)।

0812
1004
6140

অ্যালগরিদম

johnsonAlgorithm(cost)

ইনপুট - দেওয়া গ্রাফের কস্ট ম্যাট্রিক্স।

আউটপুট - যেকোনো ভার্টেক্স থেকে যেকোনো ভার্টেক্সে সবচেয়ে ছোট পাথের জন্য ম্যাট্রিক্স।

শুরু
  'A' নামক অন্য একটি ম্যাট্রিক্স তৈরি করুন cost ম্যাট্রিক্সের মত, যদি i-তম সারি এবং j-তম কলামের মধ্যে কোনো এজ নেই থাকে, তবে A[i,j]-তে infinity রাখুন
  k := 1 থেকে n পর্যন্ত, করুন
    i := 1 থেকে n পর্যন্ত, করুন
      j := 1 থেকে n পর্যন্ত, করুন
        A[i, j] = A[i, j] এবং (A[i, k] + A[k, j]) এর মধ্যে ন্যূনতম
      শেষ করুন
    শেষ করুন
  শেষ করুন
  বর্তমান A ম্যাট্রিক্স প্রদর্শন করুন
শেষ

উদাহরণ কোড

#include <iostream>
#define INF 9999
using namespace std;

int min(int a, int b);
int cost[10][10], adj[10][10];

inline int min(int a, int b) {
    return (a < b) ? a : b;
}

int main() {
    int vert, edge, i, j, k, c;
    cout << "Enter no of vertices: ";
    cin >> vert;
    cout << "Enter no of edges: ";
    cin >> edge;
    cout << "Enter the EDGE Costs:\n";
    
    for (k = 1; k <= edge; k++) { // ইনপুট নিয়ে adj এবং cost ম্যাট্রিক্সে স্টোর
        cin >> i >> j >> c;
        adj[i][j] = cost[i][j] = c;
    }
    
    for (i = 1; i <= vert; i++)
        for (j = 1; j <= vert; j++) {
            if (adj[i][j] == 0 && i != j)
                adj[i][j] = INF; // এজ না থাকলে infinity
        }
    
    for (k = 1; k <= vert; k++)
        for (i = 1; i <= vert; i++)
            for (j = 1; j <= vert; j++)
                adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j]); // k দিয়ে i থেকে j-এর ন্যূনতম পাথ
    
    cout << "Resultant adj matrix\n";
    for (i = 1; i <= vert; i++) {
        for (j = 1; j <= vert; j++) {
            if (adj[i][j] != INF)
                cout << adj[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}

আউটপুট

Enter no of vertices: 3
Enter no of edges: 5
Enter the EDGE Costs:
1 2 8
2 1 12
1 3 22
3 1 6
2 3 4
Resultant adj matrix
0 8 12
10 0 4
6 14 0
  1. C++ প্রোগ্রাম: স্ট্রিং ম্যাচিংয়ের জন্য বিট্যাপ (Bitap) অ্যালগরিদম ইমপ্লিমেন্টেশন

  2. C++ প্রোগ্রাম: এক্সটেন্ডেড ইউক্লিডিয়ান অ্যালগরিদম বাস্তবায়ন

  3. C++ প্রোগ্রাম: ইন্টারপোলেশন সার্চ অ্যালগরিদম বাস্তবায়ন

  4. অ্যারে শাফলিং-এর জন্য ফিশার-ইয়েটস অ্যালগরিদম বাস্তবায়নের C++ প্রোগ্রাম