📌  相关文章
📜  检查所有连接的组件的长度是否为斐波那契数

📅  最后修改于: 2021-04-22 08:19:30             🧑  作者: Mango

给定具有V顶点和E边的无向图,任务是查找图的所有连接部分,并检查它们的每个长度是否为斐波那契数
例如,考虑下图。

如上所述,连接的组件的长度是2、3和2,它们是斐波那契数。
例子:

方法:
将斐波那契数预计算并存储在HashSet中。如本文所述,使用DFS方法遍历顶点并生成Connected组件。检查是否所有长度都存在于预先计算的斐波那契数的HashSet中。
下面是上述方法的实现:

C++
// C++ program to check if the length of
// all connected components are a
// Fibonacci or not
#include 
using namespace std;
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
void depthFirst(int v, vector graph[],
                vector& visited, int& ans)
{
    // Mark the current vertex as visited
    visited[v] = true;
 
    // Variable ans to keep count of
    // connected components
    ans++;
    for (auto i : graph[v]) {
        if (visited[i] == false) {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
void countConnectedFibonacci(vector graph[],
                                int V, int E)
{
    // Hash Container (Set) to store
    // the Fibonacci sequence
    unordered_set fibonacci;
    fibonacci.insert(0);
    fibonacci.insert(1);
    // Pre-computation of Fibonacci sequence
    long long a = 0,b = 1;
    for (int i = 2; i < 1001; i++) {
        fibonacci.insert(a + b);
        a = a+b;
        swap(a,b);
    }
 
    // Initializing boolean visited array
    // to mark visited vertices
    vector visited(10001, false);
 
 
    // Following loop invokes DFS algorithm
    for (int i = 1; i <= V; i++) {
        if (visited[i] == false) {
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
            if(fibonacci.find(ans) == fibonacci.end())
            {
                cout << "No"< graph[1001];
     
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].push_back(2);
    graph[2].push_back(5);
    graph[3].push_back(4);
    graph[4].push_back(3);
    graph[3].push_back(6);
    graph[6].push_back(3);
    graph[8].push_back(7);
    graph[7].push_back(8);
     
    countConnectedFibonacci(graph, V, E);
    return 0;
}


Java
// Java program to check if the length of
// all connected components are a
// Fibonacci or not
 
import java.util.*;
 
class GFG{
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
static void depthFirst(int v, Vector graph[],
                boolean []visited, int ans)
{
    // Mark the current vertex as visited
    visited[v] = true;
 
    // Variable ans to keep count of
    // connected components
    ans++;
    for (int i : graph[v]) {
        if (visited[i] == false) {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
static void countConnectedFibonacci(Vector graph[],
                                int V, int E)
{
    // Hash Container (Set) to store
    // the Fibonacci sequence
    HashSet fibonacci = new HashSet();
    fibonacci.add(0);
    fibonacci.add(1);
    // Pre-computation of Fibonacci sequence
    int a = 0,b = 1;
    for (int i = 2; i < 1001; i++) {
        fibonacci.add(a + b);
        a = a + b;
        a = a + b;
        b = a - b;
        a = a - b;
    }
 
    // Initializing boolean visited array
    // to mark visited vertices
    boolean []visited = new boolean[10001];
 
 
    // Following loop invokes DFS algorithm
    for (int i = 1; i <= V; i++) {
        if (visited[i] == false) {
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
            if(!fibonacci.contains(ans))
            {
                System.out.println("No");
                return;
            }
        }
    }
 
    System.out.println("Yes");
}
 
// Driver code
public static void main(String[] args)
{
    // Initializing graph in the form of adjacency list
    Vector []graph = new Vector[1001];
    for(int i = 0; i < graph.length; i++)
        graph[i] = new Vector();
         
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].add(2);
    graph[2].add(5);
    graph[3].add(4);
    graph[4].add(3);
    graph[3].add(6);
    graph[6].add(3);
    graph[8].add(7);
    graph[7].add(8);
     
    countConnectedFibonacci(graph, V, E);
}
}
 
// This code is contributed by 29AjayKumar


C#
// C# program to check if the length of
// all connected components are a
// Fibonacci or not
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
static void depthFirst(int v, List []graph,
                         bool []visited, int ans)
{
     
    // Mark the current vertex as visited
    visited[v] = true;
 
    // Variable ans to keep count of
    // connected components
    ans++;
    foreach(int i in graph[v])
    {
        if (visited[i] == false)
        {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
static void countConnectedFibonacci(List []graph,
                                    int V, int E)
{
     
    // Hash Container (Set) to store
    // the Fibonacci sequence
    HashSet fibonacci = new HashSet();
    fibonacci.Add(0);
    fibonacci.Add(1);
     
    // Pre-computation of Fibonacci sequence
    int a = 0,b = 1;
    for(int i = 2; i < 1001; i++)
    {
        fibonacci.Add(a + b);
        a = a + b;
        a = a + b;
        b = a - b;
        a = a - b;
    }
 
    // Initializing bool visited array
    // to mark visited vertices
    bool []visited = new bool[10001];
 
 
    // Following loop invokes DFS algorithm
    for(int i = 1; i <= V; i++)
    {
        if (visited[i] == false)
        {
             
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
             
            if(!fibonacci.Contains(ans))
            {
                Console.WriteLine("No");
                return;
            }
        }
    }
    Console.WriteLine("Yes");
}
 
// Driver code
public static void Main(String[] args)
{
     
    // Initializing graph in the
    // form of adjacency list
    List []graph = new List[1001];
    for(int i = 0; i < graph.Length; i++)
        graph[i] = new List();
         
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].Add(2);
    graph[2].Add(5);
    graph[3].Add(4);
    graph[4].Add(3);
    graph[3].Add(6);
    graph[6].Add(3);
    graph[8].Add(7);
    graph[7].Add(8);
     
    countConnectedFibonacci(graph, V, E);
}
}
 
// This code is contributed by amal kumar choubey


C++
// C++ program to check if the length of
// all connected components are a
// Fibonacci or not
#include 
using namespace std;
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
void depthFirst(int v, vector graph[],
                vector& visited, int& ans)
{
    // Mark the current vertex as visited
    visited[v] = true;
 
    // Variable ans to keep count of
    // connected components
    ans++;
    for (auto i : graph[v]) {
        if (visited[i] == false) {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
void countConnectedFibonacci(vector graph[],
                                int V, int E)
{
 
    // Initializing boolean visited array
    // to mark visited vertices
    vector visited(10001, false);
 
 
    // Following loop invokes DFS algorithm
    for (int i = 1; i <= V; i++) {
        if (visited[i] == false) {
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
             
            double x1 = sqrt(5*ans*ans + 4);
            int x2 = sqrt(5 * ans * ans + 4);
             
            double y1 = sqrt(5*ans*ans - 4);
            int y2 = sqrt(5 * ans * ans - 4);
             
            if(!(x1 - x2) || !(y1 - y2))
                continue;
            else
            {
                cout << "No"< graph[1001];
     
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].push_back(2);
    graph[2].push_back(1);
    graph[2].push_back(5);
    graph[5].push_back(2);
    graph[3].push_back(4);
    graph[4].push_back(3);
    graph[3].push_back(6);
    graph[6].push_back(3);
    graph[8].push_back(7);
    graph[7].push_back(8);
     
    countConnectedFibonacci(graph, V, E);
    return 0;
}


Java
// Java program to check if the length of
// all connected components are a
// Fibonacci or not
import java.util.*;
class GFG{
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
static void depthFirst(int v, Vector graph[],
                    Vector visited, int ans)
{
    // Mark the current vertex as visited
    visited.add(v, true);
 
    // Variable ans to keep count of
    // connected components
    ans++;
    for (int i : graph[v])
    {
        if (visited.get(i) == false)
        {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
static void countConnectedFibonacci(Vector graph[],
                                    int V, int E)
{
 
    // Initializing boolean visited array
    // to mark visited vertices
    Vector visited = new Vector<>(10001);
    for(int i = 0; i < 10001; i++)
        visited.add(i, false);
 
    // Following loop invokes DFS algorithm
    for (int i = 1; i < V; i++)
    {
        if (visited.get(i) == false)
        {
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
             
            double x1 = Math.sqrt(5 * ans * ans + 4);
            int x2 = (int)Math.sqrt(5 * ans * ans + 4);
             
            double y1 = Math.sqrt(5 * ans * ans - 4);
            int y2 = (int)Math.sqrt(5 * ans * ans - 4);
             
            if((x1 - x2) != 0 || (y1 - y2) != 0)
                continue;
            else
            {
                System.out.println("No");
                return;
            }
        }
    }
    System.out.println("Yes");
}
 
// Driver code
public static void main(String[] args)
{
    // Initializing graph in the form of adjacency list
    @SuppressWarnings("unchecked")
    Vector []graph = new Vector[1001];
    for(int i = 0; i < 1001; i++)
        graph[i] = new Vector();
   
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].add(2);
    graph[2].add(1);
    graph[2].add(5);
    graph[5].add(2);
    graph[3].add(4);
    graph[4].add(3);
    graph[3].add(6);
    graph[6].add(3);
    graph[8].add(7);
    graph[7].add(8);
     
    countConnectedFibonacci(graph, V, E);
}
}
 
// This code is contributed by Rohit_ranjan


Python3
# Python3 program to check if the length of
# all connected components are a
# Fibonacci or not
from math import sqrt
 
# Function to traverse graph using
# DFS algorithm and track the
# connected components
def depthFirst(v):
    global visited, ans, graph
     
    # Mark the current vertex as visited
    visited[v] = True
 
    # Variable ans to keep count of
    # connected components
    ans += 1
    for i in graph[v]:
        if (visited[i] == False):
            depthFirst(i)
 
# Function to check and prif the
# length of all connected components
# are a Fibonacci or not
def countConnectedFibonacci(V, E):
    global graph, ans
 
    # Initializing boolean visited array
    # to mark visited vertices
    # vector visited(10001, false)
 
    # Following loop invokes DFS algorithm
    for i in range(1, V + 1):
        if (visited[i] == False):
           
            # ans variable stores the
            # length of respective
            # connected components
            ans = 0
 
            # DFS algorithm
            depthFirst(i)
            x1 = sqrt(5*ans*ans + 4)
            x2 = sqrt(5 * ans * ans + 4)
            y1 = sqrt(5*ans*ans - 4)
            y2 = sqrt(5 * ans * ans - 4)
            if((not (x1 - x2)) or (not (y1 - y2))):
                continue
            else:
                print("No")
                return
    print ("Yes")
 
# Driver code
if __name__ == '__main__':
   
    # Initializing graph in the form of adjacency list
    graph = [[] for i in range(10001)]
    visited = [False for i in range(10001)]
    ans = 0
 
    # Defining the number of edges and vertices
    E, V = 4, 7
 
    # Constructing the undirected graph
    graph[1].append(2)
    graph[2].append(1)
    graph[2].append(5)
    graph[5].append(2)
    graph[3].append(4)
    graph[4].append(3)
    graph[3].append(6)
    graph[6].append(3)
    graph[8].append(7)
    graph[7].append(8)
 
    countConnectedFibonacci(V, E)
 
# This code is contributed by mohit kumar 29.


C#
// C# program to check if the
// length of all connected
// components are a Fibonacci
// or not
using System;
using System.Collections;
class GFG{
  
// Function to traverse graph using
// DFS algorithm and track the
// connected components
static void depthFirst(int v, ArrayList []graph,
                       ArrayList visited, int ans)
{
  // Mark the current vertex
  // as visited
  visited[v] = true;
 
  // Variable ans to keep count of
  // connected components
  ans++;
   
  foreach(int i in graph[v])
  {
    if ((bool)visited[i] == false)
    {
      depthFirst(i, graph, visited, ans);
    }
  }
}
  
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
static void countConnectedFibonacci(ArrayList []graph,
                                    int V, int E)
{
  // Initializing boolean visited array
  // to mark visited vertices
  ArrayList visited = new ArrayList();
  for(int i = 0; i < 10001; i++)
    visited.Add(false);
 
  // Following loop invokes
  // DFS algorithm
  for (int i = 1; i < V; i++)
  {
    if ((bool)visited[i] == false)
    {
      // ans variable stores the
      // length of respective
      // connected components
      int ans = 0;
 
      // DFS algorithm
      depthFirst(i, graph, visited, ans);
 
      double x1 = Math.Sqrt(5 * ans * ans + 4);
      int x2 = (int)Math.Sqrt(5 * ans * ans + 4);
 
      double y1 = Math.Sqrt(5 * ans * ans - 4);
      int y2 = (int)Math.Sqrt(5 * ans * ans - 4);
 
      if((x1 - x2) != 0 || (y1 - y2) != 0)
        continue;
      else
      {
        Console.Write("No");
        return;
      }
    }
  }
  Console.Write("Yes");
}
 
// Driver code
public static void Main(string[] args)
{
  // Initializing graph in the
  // form of adjacency list
  ArrayList []graph =
              new ArrayList[1001];
 
  for(int i = 0; i < 1001; i++)
    graph[i] = new ArrayList();
 
  // Defining the number of
  // edges and vertices
  int E = 4,
      V = 7;
 
  // Constructing the
  // undirected graph
  graph[1].Add(2);
  graph[2].Add(1);
  graph[2].Add(5);
  graph[5].Add(2);
  graph[3].Add(4);
  graph[4].Add(3);
  graph[3].Add(6);
  graph[6].Add(3);
  graph[8].Add(7);
  graph[7].Add(8);
 
  countConnectedFibonacci(graph, V, E);
}
}
 
// This code is contributed by rutvik_56


输出:
Yes

复杂度分析:
程序的总体复杂度主要由三个因素决定,即深度优先遍历,从Fibonacci容器中识别元素以及对Fibonacci序列进行预计算。 DFS遍历的时间复杂度为O(E + V) ,其中E和V是图形的边缘和顶点。检查HashSet中是否存在特定长度需要O(1)时间复杂度。初始预计算的时间复杂度为O(N),其中N是斐波那契数列所存储的数字。
时间复杂度: O(N)
高效方法:
该方法基本上避免了斐波那契数的预先计算,并使用简单的公式来检查各个长度是否为斐波那契数。检测N是否为斐波那契数的公式是找到5N 2 + 45N 2 – 4的值,并检查它们中的任意一个是否为理想平方。所述配方是由I Gessel制定的,可以从此链接中引用。该程序的其余部分具有与上述类似的方法,即通过DFS遍历计算连接的组件。
下面是上述方法的实现:

C++

// C++ program to check if the length of
// all connected components are a
// Fibonacci or not
#include 
using namespace std;
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
void depthFirst(int v, vector graph[],
                vector& visited, int& ans)
{
    // Mark the current vertex as visited
    visited[v] = true;
 
    // Variable ans to keep count of
    // connected components
    ans++;
    for (auto i : graph[v]) {
        if (visited[i] == false) {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
void countConnectedFibonacci(vector graph[],
                                int V, int E)
{
 
    // Initializing boolean visited array
    // to mark visited vertices
    vector visited(10001, false);
 
 
    // Following loop invokes DFS algorithm
    for (int i = 1; i <= V; i++) {
        if (visited[i] == false) {
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
             
            double x1 = sqrt(5*ans*ans + 4);
            int x2 = sqrt(5 * ans * ans + 4);
             
            double y1 = sqrt(5*ans*ans - 4);
            int y2 = sqrt(5 * ans * ans - 4);
             
            if(!(x1 - x2) || !(y1 - y2))
                continue;
            else
            {
                cout << "No"< graph[1001];
     
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].push_back(2);
    graph[2].push_back(1);
    graph[2].push_back(5);
    graph[5].push_back(2);
    graph[3].push_back(4);
    graph[4].push_back(3);
    graph[3].push_back(6);
    graph[6].push_back(3);
    graph[8].push_back(7);
    graph[7].push_back(8);
     
    countConnectedFibonacci(graph, V, E);
    return 0;
}

Java

// Java program to check if the length of
// all connected components are a
// Fibonacci or not
import java.util.*;
class GFG{
 
// Function to traverse graph using
// DFS algorithm and track the
// connected components
static void depthFirst(int v, Vector graph[],
                    Vector visited, int ans)
{
    // Mark the current vertex as visited
    visited.add(v, true);
 
    // Variable ans to keep count of
    // connected components
    ans++;
    for (int i : graph[v])
    {
        if (visited.get(i) == false)
        {
            depthFirst(i, graph, visited, ans);
        }
    }
}
 
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
static void countConnectedFibonacci(Vector graph[],
                                    int V, int E)
{
 
    // Initializing boolean visited array
    // to mark visited vertices
    Vector visited = new Vector<>(10001);
    for(int i = 0; i < 10001; i++)
        visited.add(i, false);
 
    // Following loop invokes DFS algorithm
    for (int i = 1; i < V; i++)
    {
        if (visited.get(i) == false)
        {
            // ans variable stores the
            // length of respective
            // connected components
            int ans = 0;
 
            // DFS algorithm
            depthFirst(i, graph, visited, ans);
             
            double x1 = Math.sqrt(5 * ans * ans + 4);
            int x2 = (int)Math.sqrt(5 * ans * ans + 4);
             
            double y1 = Math.sqrt(5 * ans * ans - 4);
            int y2 = (int)Math.sqrt(5 * ans * ans - 4);
             
            if((x1 - x2) != 0 || (y1 - y2) != 0)
                continue;
            else
            {
                System.out.println("No");
                return;
            }
        }
    }
    System.out.println("Yes");
}
 
// Driver code
public static void main(String[] args)
{
    // Initializing graph in the form of adjacency list
    @SuppressWarnings("unchecked")
    Vector []graph = new Vector[1001];
    for(int i = 0; i < 1001; i++)
        graph[i] = new Vector();
   
    // Defining the number of edges and vertices
    int E = 4,V = 7;
 
    // Constructing the undirected graph
    graph[1].add(2);
    graph[2].add(1);
    graph[2].add(5);
    graph[5].add(2);
    graph[3].add(4);
    graph[4].add(3);
    graph[3].add(6);
    graph[6].add(3);
    graph[8].add(7);
    graph[7].add(8);
     
    countConnectedFibonacci(graph, V, E);
}
}
 
// This code is contributed by Rohit_ranjan

Python3

# Python3 program to check if the length of
# all connected components are a
# Fibonacci or not
from math import sqrt
 
# Function to traverse graph using
# DFS algorithm and track the
# connected components
def depthFirst(v):
    global visited, ans, graph
     
    # Mark the current vertex as visited
    visited[v] = True
 
    # Variable ans to keep count of
    # connected components
    ans += 1
    for i in graph[v]:
        if (visited[i] == False):
            depthFirst(i)
 
# Function to check and prif the
# length of all connected components
# are a Fibonacci or not
def countConnectedFibonacci(V, E):
    global graph, ans
 
    # Initializing boolean visited array
    # to mark visited vertices
    # vector visited(10001, false)
 
    # Following loop invokes DFS algorithm
    for i in range(1, V + 1):
        if (visited[i] == False):
           
            # ans variable stores the
            # length of respective
            # connected components
            ans = 0
 
            # DFS algorithm
            depthFirst(i)
            x1 = sqrt(5*ans*ans + 4)
            x2 = sqrt(5 * ans * ans + 4)
            y1 = sqrt(5*ans*ans - 4)
            y2 = sqrt(5 * ans * ans - 4)
            if((not (x1 - x2)) or (not (y1 - y2))):
                continue
            else:
                print("No")
                return
    print ("Yes")
 
# Driver code
if __name__ == '__main__':
   
    # Initializing graph in the form of adjacency list
    graph = [[] for i in range(10001)]
    visited = [False for i in range(10001)]
    ans = 0
 
    # Defining the number of edges and vertices
    E, V = 4, 7
 
    # Constructing the undirected graph
    graph[1].append(2)
    graph[2].append(1)
    graph[2].append(5)
    graph[5].append(2)
    graph[3].append(4)
    graph[4].append(3)
    graph[3].append(6)
    graph[6].append(3)
    graph[8].append(7)
    graph[7].append(8)
 
    countConnectedFibonacci(V, E)
 
# This code is contributed by mohit kumar 29.

C#

// C# program to check if the
// length of all connected
// components are a Fibonacci
// or not
using System;
using System.Collections;
class GFG{
  
// Function to traverse graph using
// DFS algorithm and track the
// connected components
static void depthFirst(int v, ArrayList []graph,
                       ArrayList visited, int ans)
{
  // Mark the current vertex
  // as visited
  visited[v] = true;
 
  // Variable ans to keep count of
  // connected components
  ans++;
   
  foreach(int i in graph[v])
  {
    if ((bool)visited[i] == false)
    {
      depthFirst(i, graph, visited, ans);
    }
  }
}
  
// Function to check and print if the
// length of all connected components
// are a Fibonacci or not
static void countConnectedFibonacci(ArrayList []graph,
                                    int V, int E)
{
  // Initializing boolean visited array
  // to mark visited vertices
  ArrayList visited = new ArrayList();
  for(int i = 0; i < 10001; i++)
    visited.Add(false);
 
  // Following loop invokes
  // DFS algorithm
  for (int i = 1; i < V; i++)
  {
    if ((bool)visited[i] == false)
    {
      // ans variable stores the
      // length of respective
      // connected components
      int ans = 0;
 
      // DFS algorithm
      depthFirst(i, graph, visited, ans);
 
      double x1 = Math.Sqrt(5 * ans * ans + 4);
      int x2 = (int)Math.Sqrt(5 * ans * ans + 4);
 
      double y1 = Math.Sqrt(5 * ans * ans - 4);
      int y2 = (int)Math.Sqrt(5 * ans * ans - 4);
 
      if((x1 - x2) != 0 || (y1 - y2) != 0)
        continue;
      else
      {
        Console.Write("No");
        return;
      }
    }
  }
  Console.Write("Yes");
}
 
// Driver code
public static void Main(string[] args)
{
  // Initializing graph in the
  // form of adjacency list
  ArrayList []graph =
              new ArrayList[1001];
 
  for(int i = 0; i < 1001; i++)
    graph[i] = new ArrayList();
 
  // Defining the number of
  // edges and vertices
  int E = 4,
      V = 7;
 
  // Constructing the
  // undirected graph
  graph[1].Add(2);
  graph[2].Add(1);
  graph[2].Add(5);
  graph[5].Add(2);
  graph[3].Add(4);
  graph[4].Add(3);
  graph[3].Add(6);
  graph[6].Add(3);
  graph[8].Add(7);
  graph[7].Add(8);
 
  countConnectedFibonacci(graph, V, E);
}
}
 
// This code is contributed by rutvik_56
输出:
Yes

复杂度分析:
时间复杂度:O(V + E)
该方法避免了较早的预计算,并使用数学公式来检测各个长度是否为斐波那契数。因此,由于可以避免使用任何HashSet来存储斐波那契数,因此可以在恒定的时间O(1)和恒定的空间中实现计算。因此,仅通过DFS遍历即可确定此方法中程序的整体复杂性。因此,复杂度为O(E + V) ,其中E和V是无向图的边和顶点数。