কম্পিউটার

একটি নির্দেশিত গ্রাফে চক্র সনাক্ত করুন


ডেপথ ফার্স্ট সার্চ (DFS) ট্রাভার্সাল অ্যালগরিদম ব্যবহার করে আমরা একটি নির্দেশিত গ্রাফে চক্র সনাক্ত করতে পারি। কোনো নোডে কোনো স্ব-লুপ থাকলে, এটি একটি চক্র হিসেবে বিবেচিত হবে, অন্যথায়, যখন চাইল্ড নোডের অভিভাবককে সংযুক্ত করার জন্য আরেকটি প্রান্ত থাকে, তখন এটিও একটি চক্র হবে৷

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

একটি নির্দেশিত গ্রাফে চক্র সনাক্ত করুন

এই পদ্ধতিতে, আমরা DFS ট্র্যাভারসাল সম্পাদন করতে নোড বরাদ্দ করতে বিভিন্ন সেট ব্যবহার করব। তিনটি ভিন্ন সেট আছে, সাদা, ধূসর এবং কালো। প্রাথমিকভাবে, সমস্ত নোড সাদা সেটের ভিতরে সংরক্ষণ করা হবে। যখন একটি নতুন নোড অতিক্রম করা হয়, তখন এটি ধূসর সেটে সংরক্ষণ করা হবে এবং সাদা থেকে সরানো হবে। এবং ব্যাকট্র্যাকিং শেষ করার পরে, যখন সেই নোডের জন্য সেই কাজটি সম্পন্ন হবে, তখন এটি ধূসর থেকে কালো সেটে অদলবদল করা হবে৷

ইনপুট এবং আউটপুট

Input:
The Adjacency matrix.

0 1 0 0 0
0 0 0 0 0
1 0 0 1 0
0 0 0 0 1
0 0 1 0 0

Output:
The graph has cycle. 

অ্যালগরিদম

dfs(curr, wSet, gSet, bSet)

ইনপুট: বর্তমান নোড, সাদা, ধূসর এবং কালো সেট।

আউটপুট: একটি চক্র থাকলে সত্য৷

Begin
   delete curr from the while set and add it to the grey set
   for all nodes v connected with curr in the graph, do
      if v is in the black set, then
         skip next part, and go for next iteration
      if v is in the grey set, then
         return true
      if dfs(v, wSet, gSet, bSet) is true, then
         return true
   done
   delete curr from grey set and add to black set
   return fasle
End

হ্যা সাইকেল(গ্রাফ)

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

আউটপুট: গ্রাফটি সাইকেল করলে সত্য৷

Begin
   initially insert all nodes into the white set
   while white set has some elements, do
      for all nodes v in the graph, do
         if v is not in the white set, then
            if dfs(v, wSet, gSet, bSet), then
               return true
      done
   done
   return false
End

উদাহরণ

#include<iostream>
#include<set>
#define NODE 5
using namespace std;

int graph[NODE][NODE] = {
   {0, 1, 0, 0, 0},
   {0, 0, 0, 0, 0},
   {1, 0, 0, 1, 0},
   {0, 0, 0, 0, 1},
   {0, 0, 1, 0, 0}
};

bool dfs(int curr, set<int>&wSet, set<int>&gSet, set<int>&bSet) {
   //moving curr to white set to grey set.
   wSet.erase(wSet.find(curr));
   gSet.insert(curr);

   for(int v = 0; v < NODE; v++) {
      if(graph[curr][v] != 0) {    //for all neighbour vertices
         if(bSet.find(v) != bSet.end())
            continue;    //if the vertices are in the black set
         if(gSet.find(v) != gSet.end())
            return true;    //it is a cycle
         if(dfs(v, wSet, gSet, bSet))
            return true;    //cycle found
      }
   }

   //moving v to grey set to black set.
   gSet.erase(gSet.find(curr));
   bSet.insert(curr);
   return false;
}

bool hasCycle() {
   set<int> wSet, gSet, bSet;    //three set as white, grey and black
   for(int i = 0; i<NODE; i++)
      wSet.insert(i);    //initially add all node into the white set

   while(wSet.size() > 0) {
      for(int current = 0; current < NODE; current++) {
         if(wSet.find(current) != wSet.end())
            if(dfs(current, wSet, gSet, bSet))
               return true;
      }
   }
   return false;
}

int main() {
   bool res;
   res = hasCycle();
   if(res)
      cout << "The graph has cycle." << endl;
   else
      cout << "The graph has no cycle." << endl;
}

আউটপুট

The graph has cycle.

  1. একটি নির্দেশিত গ্রাফে ইউলারিয়ান চক্র রয়েছে কিনা তা পরীক্ষা করার জন্য C++ প্রোগ্রাম

  2. পাইথনে নির্দেশিত গ্রাফে সবচেয়ে বড় রঙের মান খুঁজে বের করার প্রোগ্রাম

  3. পাইথনে নির্দেশিত গ্রাফটি বিপরীত করার জন্য প্রোগ্রাম

  4. একটি নির্দেশিত গ্রাফে চক্র সনাক্তকরণের জন্য পাইথন প্রোগ্রাম