📜  寻找来自不同国家的宇航员

📅  最后修改于: 2021-10-25 03:16:42             🧑  作者: Mango

给定一个表示宇航员数量的正整数 N (从(N – 1) 中标记为 0 )和一个矩阵mat[][]包含来自同一国家的宇航员对,任务是计算方式的数量选择两名来自不同国家的宇航员。

例子:

方法:给定的问题可以通过将这个问题建模为一个图来解决,其中宇航员代表图的顶点,给定的对代表图中的边。构建该图后,其想法是计算从不同国家选择 2 名宇航员的方法数。请按照以下步骤解决问题:

  • 创建一个列表列表, adj[][]来存储图的邻接列表。
  • 使用变量i遍历给定数组arr[]并将arr[i][1]附加到adj[arr[i][0]]并将arr[i][0]附加到adj[arr[i][1] ]]为无向边。
  • 现在,使用本文中讨论的方法,通过执行深度优先搜索来查找图的每个连通分量的大小,并将所有连通分量的大小存储在一个数组中,例如v[]
  • 初始化一个整数变量,比如ans作为从 N名宇航员中选择 2 名宇航员的方法总数,即 N*(N – 1)/2
  • 遍历数组v[]并从变量ans 中减去 v[i]*(v[i] – 1)/2以排除每个连接组件之间的所有可能对。
  • 完成以上步骤后,打印ans的值作为结果。

下面是上述方法的实现:

C++
// C++ program for the above approach
  
#include 
using namespace std;
  
// Function to perform the DFS Traversal
// to find the count of connected
// components
void dfs(int v, vector >& adj,
         vector& visited, int& num)
{
    // Marking vertex visited
    visited[v] = true;
    num++;
  
    // DFS call to neighbour vertices
    for (int i = 0; i < adj[v].size(); i++) {
  
        // If the current node is not
        // visited, then recursively
        // call DFS
        if (!visited[adj[v][i]]) {
            dfs(adj[v][i], adj,
                visited, num);
        }
    }
}
  
// Function to find the number of ways
// to choose two astronauts from the
// different countries
void numberOfPairs(
    int N, vector > arr)
{
    // Stores the Adjacency list
    vector > adj(N);
  
    // Constructing the graph
    for (vector& i : arr) {
        adj[i[0]].push_back(i[1]);
        adj[i[1]].push_back(i[0]);
    }
  
    // Stores the visited vertices
    vector visited(N);
  
    // Stores the size of every
    // connected components
    vector v;
  
    int num = 0;
    for (int i = 0; i < N; i++) {
  
        if (!visited[i]) {
  
            // DFS call to the graph
            dfs(i, adj, visited, num);
  
            // Store size of every
            // connected component
            v.push_back(num);
            num = 0;
        }
    }
  
    // Stores the total number of
    // ways to count the pairs
    int ans = N * (N - 1) / 2;
  
    // Traverse the array
    for (int i : v) {
        ans -= (i * (i - 1) / 2);
    }
  
    // Print the value of ans
    cout << ans;
}
  
// Driver Code
int main()
{
    int N = 6;
    vector > arr = { { 0, 1 }, { 0, 2 }, { 2, 5 } };
    numberOfPairs(N, arr);
  
    return 0;
}


输出:
9

时间复杂度: O(N + E),其中 N 是顶点数,E 是边数。
辅助空间: O(N + E)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。