C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

与えられた数のエッジに対してランダムな有向非巡回グラフDACを生成するC++プログラム


このプログラムでは、指定されたエッジ「e」に対してランダムな有向非巡回グラフを生成します。このプログラムの時間計算量はO(e * v * e)です。

アルゴリズム

Begin
   function GenerateRandomGraphs(), has ‘e’ as the number edges in the argument list.
   generate a connection between two random numbers, for sample a small case, limit the number of vertex to 20.
   Check for the cycle in the graph Using CheckAcyclic(),
   if it returns false discard this edge.
      Else maintain the edge in the graph.
   Print all the directed connection of each vertex.
   If the in+out degree of each vertex is zero then print the vertex as “isolated vertex”.
End

サンプルコード

#include<iostream>
#include<stdlib.h>
#define N 10
using namespace std;
bool Checkcyclic(int ed[][2], int edge, bool check[], int v)//to check for the cycle, on addition of a new edge in the random graph.{
   int i;
   // If the current vertex is visited already, then the graph contains cycle.
   if(check[v] == true) {
      return false;
   } else {
      check[v] = true;
      // For each vertex, go for all the vertex connected to it.
      for(i = edge; i >= 0; i--) {
         if(ed[i][0] == v) {
            return Checkcyclic(ed, edge, check, ed[i][1]);
         }
      }
   }
   // In case, if the path ends then reassign the vertexes visited in that path to false again.
   check[v] = false;
   if(i == 0)
      return true;
}

void GenerateRandomGraphs(int e) {
   int i, j, ed[e][2], count;
   bool c[11];
   i = 0;
   while(i < e) {
      ed[i][0] = rand()%N+1;
      ed[i][1] = rand()%N+1;
      for(j = 1; j <= 10; j++)
         c[j] = false;
      if(Checkcyclic(ed, i, c, ed[i][0]) == true)
         i++;
   }
   cout<<"\nThe generated random random graph is: ";
   for(i = 0; i < N; i++) {
      count = 0;
      cout<<"\n\t"<<i+1<<"-> { ";
         for(j = 0; j < e; j++) {
            if(ed[j][0] == i+1) {
               cout<<ed[j][1]<<" ";
               count++;
            } else if(ed[j][1] == i+1) {
               count++;
            } else if(j == e-1 && count == 0)
               cout<<"Isolated Vertex!";
         }
         cout<<" }";
      }
   }
   int main() {
      int e;
      cout<<"Enter the number of edges for the random graphs: ";
      cin>>e;
      GenerateRandomGraphs(e);
   }
}


出力

Enter the number of edges for the random graphs: 4
The generated random random graph is:
1-> { }
2-> { 8 }
3-> { 5 }
4-> { Isolated Vertex! }
5-> { 1 }
6-> { Isolated Vertex! }
7-> { Isolated Vertex! }
8-> { }
9-> { Isolated Vertex! }
10-> { 5 }

  1. C++での10進数から16進数への変換プログラム

    10進数を入力として指定すると、タスクは指定された10進数を16進数に変換することです。 コンピューターの16進数は16を底とし、10進数は10を底とし、0〜9の値で表されますが、16進数は0〜15から始まる数字で、10はA、11はB、12はC、 Dとして13、Eとして14、Fとして15。 10進数を16進数に変換するには、指定された手順に従います- まず、指定された数値を変換数値の基本値で除算します。例: 6789を16を底とする16進数に変換し、商を取得して格納する必要があるため、6789を16で除算します。余りが0〜9の場合はそのまま保存し、余りが10〜15の場合は、文字形式でA-

  2. C++での10進数から2進数への変換プログラム

    10進数を入力として指定すると、タスクは指定された10進数を2進数に変換することです。 コンピューターの10進数は10進数で表され、2進数は2進数の0と1の2つしかないため、2進数で表されますが、10進数は0〜9から始まる任意の数値にすることができます。 10進数を2進数に変換するには、次の手順に従います- まず、指定された数値を変換数値の基本値で除算します。例: 42を2を底とする2進数に変換し、商を取得して格納する必要があるため、42を2で除算します。余りが0の場合、ビットを0として格納します。それ以外の場合は1です。 取得した商を2進数の基数である2で除算し、ビットを格納し続けます