📜  有向图和无向图中的三角形数

📅  最后修改于: 2022-05-13 01:57:54.325000             🧑  作者: Mango

有向图和无向图中的三角形数

给定一个图形,计算其中三角形的数量。图可以是有向的或无向的。

例子:

Input: digraph[V][V] = { {0, 0, 1, 0},
                        {1, 0, 0, 1},
                        {0, 1, 0, 0},
                        {0, 0, 1, 0}
                      };
Output: 2
Give adjacency matrix represents following 
directed graph.

三角形

我们已经讨论了一种基于图迹的方法,该方法适用于无向图。在这篇文章中,我们讨论了一种新方法,它更简单,适用于有向图和无向图。
这个想法是使用三个嵌套循环来考虑每个三元组(i,j,k)并检查上述条件(从 i 到 j,j 到 k 和 k 到 i 有一条边)
然而,在无向图中,三元组 (i, j, k) 可以置换为六种组合(详情请参阅上一篇文章)。因此,我们将总数除以 6 以获得三角形的实际数量。
在有向图的情况下,排列数将为 3(随着节点的顺序变得相关)。因此,在这种情况下,三角形的总数将通过将总数除以 3 来获得。例如,考虑下面给出的有向图

以下是实现。

C++
// C++ program to count triangles
// in a graph. The program is for
// adjacency matrix representation
// of the graph.
#include
 
// Number of vertices in the graph
#define V 4
 
using namespace std;
 
// function to calculate the
// number of triangles in a
// simple directed/undirected
// graph. isDirected is true if
// the graph is directed, its
// false otherwise
int countTriangle(int graph[V][V],
                  bool isDirected)
{
    // Initialize result
    int count_Triangle = 0;
 
    // Consider every possible
    // triplet of edges in graph
    for (int i = 0; i < V; i++)
    {
        for (int j = 0; j < V; j++)
        {
            for (int k = 0; k < V; k++)
            {
               // Check the triplet if
               // it satisfies the condition
               if (graph[i][j] && graph[j][k]
                               && graph[k][i])
                  count_Triangle++;
             }
        }
    }
 
    // If graph is directed ,
    // division is done by 3,
    // else division by 6 is done
    isDirected? count_Triangle /= 3 :
                count_Triangle /= 6;
 
    return count_Triangle;
}
 
//driver function to check the program
int main()
{
    // Create adjacency matrix
    // of an undirected graph
    int graph[][V] = { {0, 1, 1, 0},
                       {1, 0, 1, 1},
                       {1, 1, 0, 1},
                       {0, 1, 1, 0}
                     };
 
    // Create adjacency matrix
    // of a directed graph
    int digraph[][V] = { {0, 0, 1, 0},
                        {1, 0, 0, 1},
                        {0, 1, 0, 0},
                        {0, 0, 1, 0}
                       };
 
    cout << "The Number of triangles in undirected graph : "
         << countTriangle(graph, false);
    cout << "\n\nThe Number of triangles in directed graph : "
         << countTriangle(digraph, true);
 
    return 0;
}


Java
// Java program to count triangles
// in a graph.  The program is
// for adjacency matrix
// representation of the graph.
import java.io.*;
 
class GFG {
 
    // Number of vertices in the graph
    int V = 4;
 
    // function to calculate the number
    // of triangles in a simple
    // directed/undirected graph. isDirected
    // is true if the graph is directed,
    // its false otherwise.
    int countTriangle(int graph[][],
                      boolean isDirected)
   {
       // Initialize result
       int count_Triangle = 0;
 
       // Consider every possible
       // triplet of edges in graph
       for (int i = 0; i < V; i++)
       {
           for (int j = 0; j < V; j++)
           {
               for (int k=0; k


Python3
# Python program to count triangles
# in a graph.  The program is
# for adjacency matrix
# representation of the graph.
 
 
# function to calculate the number
# of triangles in a simple
# directed/undirected graph.
# isDirected is true if the graph
# is directed, its false otherwise
def countTriangle(g, isDirected):
    nodes = len(g)
    count_Triangle = 0
     
    # Consider every possible
    # triplet of edges in graph
    for i in range(nodes):
        for j in range(nodes):
            for k in range(nodes):
                 
                # check the triplet
                # if it satisfies the condition
                if(i != j and i != k
                   and j != k and
                   g[i][j] and g[j][k]
                   and g[k][i]):
                    count_Triangle += 1
     
    # If graph is directed , division is done by 3
    # else division by 6 is done
    if isDirected:
      return count_Triangle//3 
    else: return count_Triangle//6
 
 
# Create adjacency matrix of an undirected graph
graph = [[0, 1, 1, 0],
         [1, 0, 1, 1],
         [1, 1, 0, 1],
         [0, 1, 1, 0]]
# Create adjacency matrix of a directed graph
digraph = [[0, 0, 1, 0],
           [1, 0, 0, 1],
           [0, 1, 0, 0],
           [0, 0, 1, 0]]
 
print("The Number of triangles in undirected graph : %d" %
      countTriangle(graph, False))
 
print("The Number of triangles in directed graph : %d" %
      countTriangle(digraph, True))
 
# This code is contributed by Neelam Yadav


C#
// C# program to count triangles in a graph.
// The program is for adjacency matrix
// representation of the graph.
using System;
 
class GFG {
 
    // Number of vertices in the graph
    const int V = 4;
 
    // function to calculate the
    // number of triangles in a
    // simple directed/undirected
    // graph. isDirected is true if
    // the graph is directed, its
    // false otherwise
    static int countTriangle(int[, ] graph, bool isDirected)
    {
        // Initialize result
        int count_Triangle = 0;
 
        // Consider every possible
        // triplet of edges in graph
        for (int i = 0; i < V; i++)
        {
            for (int j = 0; j < V; j++)
            {
                for (int k = 0; k < V; k++)
                {
                    // check the triplet if
                    // it satisfies the condition
                    if (graph[i, j] != 0
                        && graph[j, k] != 0
                        && graph[k, i] != 0)
                        count_Triangle++;
                }
            }
        }
 
        // if graph is directed ,
        // division is done by 3,
        // else division by 6 is done
        if (isDirected != false)
            count_Triangle = count_Triangle / 3;
        else
            count_Triangle = count_Triangle / 6;
 
        return count_Triangle;
    }
 
    // Driver code
    static void Main()
    {
 
        // Create adjacency matrix
        // of an undirected graph
        int[, ] graph = new int[4, 4] { { 0, 1, 1, 0 },
                                        { 1, 0, 1, 1 },
                                        { 1, 1, 0, 1 },
                                        { 0, 1, 1, 0 } };
 
        // Create adjacency matrix
        // of a directed graph
        int[, ] digraph = new int[4, 4] { { 0, 0, 1, 0 },
                                          { 1, 0, 0, 1 },
                                          { 0, 1, 0, 0 },
                                          { 0, 0, 1, 0 } };
 
        Console.Write("The Number of triangles"
                      + " in undirected graph : "
                      + countTriangle(graph, false));
 
        Console.Write("\n\nThe Number of "
                      + "triangles in directed graph : "
                      + countTriangle(digraph, true));
    }
}
 
// This code is contributed by anuj_67


PHP


Javascript


输出
The Number of triangles in undirected graph : 2

The Number of triangles in directed graph : 2

此方法与以前方法的比较
好处:

  • 无需计算 Trace。
  • 不需要矩阵乘法。
  • 不需要辅助矩阵,因此在空间上进行了优化。
  • 适用于有向图。

缺点:

  • 时间复杂度为 O(n 3 ),无法进一步降低。