📌  相关文章
📜  检查图中的每个顶点三元组是否包含连接到第三个顶点的两个顶点

📅  最后修改于: 2021-04-22 09:56:09             🧑  作者: Mango

给定一个具有N个顶点和K个边的无向图,任务是检查在图中三个顶点的每个组合中是否存在两个连接到第三顶点的顶点。换句话说,对于每个顶点三元组(a,b,c) ,如果在ac之间存在一条路径,那么在bc之间也应该存在一条路径。

例子:

方法:按照以下步骤解决问题–

  • 通过DFS遍历技术从任何组件遍历图形,并维护两个变量以存储最小组件和最大组件。
  • 将每个分量的最大值和最小值存储在向量中。
  • 现在,如果任意两个分量的最小值和最大值间隔中都有一个交集,则将存在一个有效的(a

下面是上述方法的实现

C++
// C++ program of the
// above approach
 
#include 
using namespace std;
 
// Function to add edge into
// the graph
void addEdge(vector adj[],
             int u, int v)
{
    adj[u].push_back(v);
    adj[v].push_back(u);
}
 
void DFSUtil(int u, vector adj[],
             vector& visited,
             int& componentMin,
             int& componentMax)
{
    visited[u] = true;
 
    // Finding the maximum and
    // minimum values in each component
    componentMax = max(componentMax, u);
    componentMin = min(componentMin, u);
 
    for (int i = 0; i < adj[u].size(); i++)
        if (visited[adj[u][i]] == false)
            DFSUtil(adj[u][i], adj, visited,
                    componentMin, componentMax);
}
 
// Function for checking whether
// the given graph is valid or not
bool isValid(vector >& v)
{
    int MAX = -1;
    bool ans = 0;
    // Checking for intersecting intervals
    for (auto i : v) {
        // If intersection is found
        if (i.first <= MAX) {
 
            // Graph is not valid
            ans = 1;
        }
 
        MAX = max(MAX, i.second);
    }
 
    return (ans == 0 ? 1 : 0);
}
 
// Function for the DFS Traversal
void DFS(vector adj[], int V)
{
    std::vector > v;
    // Traversing for every vertex
    vector visited(V, false);
    for (int u = 1; u <= V; u++) {
        if (visited[u] == false) {
            int componentMax = u;
            int componentMin = u;
 
            DFSUtil(u, adj, visited,
                    componentMin, componentMax);
 
            // Storing maximum and minimum
            // values of each component
            v.push_back({ componentMin,
                          componentMax });
        }
    }
 
    bool check = isValid(v);
 
    if (check)
        cout << "Yes";
    else
        cout << "No";
 
    return;
}
 
// Driver code
int main()
{
    int N = 4, K = 3;
 
    vector adj[N + 1];
 
    addEdge(adj, 1, 2);
    addEdge(adj, 2, 3);
    addEdge(adj, 3, 4);
 
    DFS(adj, N);
 
    return 0;
}


Java
// Java program of the
// above approach
import java.util.*;
import java.lang.*;
 
class GFG{
     
static class pair
{
    int first, second;
    pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
 
// Function to add edge into
// the graph
static void addEdge(ArrayList> adj,
                    int u, int v)
{
    adj.get(u).add(v);
    adj.get(v).add(u);
}
 
static void DFSUtil(int u,
                    ArrayList> adj,
                    boolean[] visited,
                    int componentMin,
                    int componentMax)
{
    visited[u] = true;
 
    // Finding the maximum and
    // minimum values in each component
    componentMax = Math.max(componentMax, u);
    componentMin = Math.min(componentMin, u);
 
    for(int i = 0; i < adj.get(u).size(); i++)
        if (visited[adj.get(u).get(i)] == false)
            DFSUtil(adj.get(u).get(i), adj, visited,
                    componentMin, componentMax);
}
 
// Function for checking whether
// the given graph is valid or not
static boolean isValid(ArrayList v)
{
    int MAX = -1;
    boolean ans = false;
     
    // Checking for intersecting intervals
    for(pair i : v)
    {
         
        // If intersection is found
        if (i.first <= MAX)
        {
             
            // Graph is not valid
            ans = true;
        }
        MAX = Math.max(MAX, i.second);
    }
    return (ans == false ? true : false);
}
 
// Function for the DFS Traversal
static void DFS(ArrayList> adj,
                int V)
{
   ArrayList v = new ArrayList<>();
    
   // Traversing for every vertex
   boolean[] visited = new boolean[V + 1];
    
    for(int u = 1; u <= V; u++)
    {
        if (visited[u] == false)
        {
            int componentMax = u;
            int componentMin = u;
 
            DFSUtil(u, adj, visited,
                    componentMin,
                    componentMax);
 
            // Storing maximum and minimum
            // values of each component
            v.add(new pair(componentMin,
                           componentMax));
        }
    }
 
    boolean check = isValid(v);
 
    if (check)
        System.out.println("Yes");
    else
        System.out.println("No");
 
    return;
}
 
// Driver code
public static void main (String[] args)
{
    int N = 4, K = 3;
     
    ArrayList> adj = new ArrayList<>();
     
    for(int i = 0; i <= N + 1; i++)
        adj.add(new ArrayList<>());
     
    addEdge(adj, 1, 2);
    addEdge(adj, 2, 3);
    addEdge(adj, 3, 4);
     
    DFS(adj, N);
}
}
 
// This code is contributed by offbeat


Python3
# Python3 program of the
# above approach
 
# Function to add edge into
# the graph
def addEdge(adj, u, v):
 
    adj[u].append(v)
    adj[v].append(u)
    return adj
 
def DFSUtil(u, adj, visited,
            componentMin, componentMax):
 
    visited[u] = True
 
    # Finding the maximum and
    # minimum values in each component
    componentMax = max(componentMax, u)
    componentMin = min(componentMin, u)
 
    for i in range(len(adj[u])):
        if (visited[adj[u][i]] == False):
            visited, componentMax, componentMin = DFSUtil(
                adj[u][i], adj, visited, componentMin,
                componentMax)
             
    return visited, componentMax, componentMin
 
# Function for checking whether
# the given graph is valid or not
def isValid(v):
 
    MAX = -1
    ans = False
 
    # Checking for intersecting intervals
    for i in v:
        if len(i) != 2:
            continue
         
        # If intersection is found
        if (i[0] <= MAX):
 
            # Graph is not valid
            ans = True
 
        MAX = max(MAX, i[1])
 
    return (True if ans == False else False)
 
# Function for the DFS Traversal
def DFS(adj, V):
 
    v = [[]]
     
    # Traversing for every vertex
    visited = [False for i in range(V + 1)]
     
    for u in range(1, V + 1):
        if (visited[u] == False):
            componentMax = u
            componentMin = u
 
            visited, componentMax, componentMin = DFSUtil(
                u, adj, visited, componentMin,
                componentMax)
 
            # Storing maximum and minimum
            # values of each component
            v.append([componentMin, componentMax])
 
    check = isValid(v)
 
    if (check):
        print('Yes')
    else:
        print('No')
 
    return
 
# Driver code
if __name__=="__main__":
 
    N = 4
    K = 3
 
    adj = [[] for i in range(N + 1)]
 
    adj = addEdge(adj, 1, 2)
    adj = addEdge(adj, 2, 3)
    adj = addEdge(adj, 3, 4)
 
    DFS(adj, N)
 
# This code is contributed by rutvik_56


C#
// C# program of the
// above approach
using System;
using System.Collections;
using System.Collections.Generic;
  
class GFG{
      
class pair
{
    public int first, second;
    public pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
  
// Function to add edge into
// the graph
static void addEdge(ArrayList adj,
                    int u, int v)
{
    ((ArrayList)adj[u]).Add(v);
    ((ArrayList)adj[v]).Add(u);
}
  
static void DFSUtil(int u, ArrayList adj,
                    bool[] visited,
                    int componentMin,
                    int componentMax)
{
    visited[u] = true;
  
    // Finding the maximum and
    // minimum values in each component
    componentMax = Math.Max(componentMax, u);
    componentMin = Math.Min(componentMin, u);
  
    for(int i = 0; i < ((ArrayList)adj[u]).Count; i++)
        if (visited[(int)((ArrayList)adj[u])[i]] == false)
            DFSUtil((int)((ArrayList)adj[u])[i], adj, visited,
                    componentMin, componentMax);
}
  
// Function for checking whether
// the given graph is valid or not
static bool isValid(ArrayList v)
{
    int MAX = -1;
    bool ans = false;
      
    // Checking for intersecting intervals
    foreach(pair i in v)
    {
          
        // If intersection is found
        if (i.first <= MAX)
        {
              
            // Graph is not valid
            ans = true;
        }
        MAX = Math.Max(MAX, i.second);
    }
    return (ans == false ? true : false);
}
  
// Function for the DFS Traversal
static void DFS(ArrayList adj,
                int V)
{
   ArrayList v = new ArrayList();
     
   // Traversing for every vertex
   bool[] visited = new bool[V + 1];
     
    for(int u = 1; u <= V; u++)
    {
        if (visited[u] == false)
        {
            int componentMax = u;
            int componentMin = u;
  
            DFSUtil(u, adj, visited,
                    componentMin,
                    componentMax);
  
            // Storing maximum and minimum
            // values of each component
            v.Add(new pair(componentMin,
                           componentMax));
        }
    }
  
    bool check = isValid(v);
  
    if (check)
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
  
    return;
}
  
// Driver code
public static void Main(string[] args)
{
    int N = 4;
      
    ArrayList adj = new ArrayList();
      
    for(int i = 0; i <= N + 1; i++)
        adj.Add(new ArrayList());
      
    addEdge(adj, 1, 2);
    addEdge(adj, 2, 3);
    addEdge(adj, 3, 4);
      
    DFS(adj, N);
}
}
 
// This code is contributed by pratham76


输出:
Yes

时间复杂度: O(N + E)
辅助空间: O(N)