// Some code
ll n, e;
cin >> n >> e;
ll adj[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
adj[i][j] = INT_MAX;
if (i == j)
adj[i][j] = 0;
}
}
এখানে গ্রাফের এডজেসেন্সি ম্যাট্রিক্সটা ইনিশিয়ালাইজ করলাম।
// Some code
while (e--)
{
int a, b, c;
cin >> a >> b >> c;
adj[a][b] = c;
}
এবার এজ ইনপুট নিয়ে সেটার ভ্যালু এডজেসেন্সি ম্যাট্রিক্স এ রাখলাম।
// Some code
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (adj[i][k] + adj[k][j] < adj[i][j])
{
adj[i][j] = adj[i][k] + adj[k][j];
}
}
}
}
এখন আসল কাজটা করব। এখানে k এর লুপটা সেই মধ্যস্ততাকারী নোডকে চুজ করবে। আর i আর j লুপ যথাক্রমে সোর্স আর ডেস্টিনেশন হিসেবে কাজ করবে। আর রিল্যাক্স এর লজিকটা হচ্ছে যদি i->k + k->j < i->j হয় তাহলে তা আপডেট হবে।
সম্পূর্ণ কোডঃ
// Some code
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
ll n, e;
cin >> n >> e;
ll adj[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
adj[i][j] = INT_MAX;
if (i == j)
adj[i][j] = 0;
}
}
while (e--)
{
int a, b, c;
cin >> a >> b >> c;
adj[a][b] = c;
}
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (adj[i][k] + adj[k][j] < adj[i][j])
{
adj[i][j] = adj[i][k] + adj[k][j];
}
}
}
}
// cout << "AFTER" << endl;
// for (int i = 0; i < n; i++)
// {
// for (int j = 0; j < n; j++)
// {
// if (adj[i][j] == INT_MAX)
// cout << "INF ";
// else
// cout << adj[i][j] << " ";
// }
// cout << endl;
// }
for (int i = 0; i < n; i++)
{
if (adj[i][i] < 0)
{
cout << "Cycle detected" << endl;
break;
}
}
return 0;
}