# Find same contacts in a list of contacts

Given a list of contacts containing username, email and phone number in any order. Identify the same contacts (i.e., same person having many different contacts) and output the same contacts together.

Notes:
1) A contact can store its three fields in any order, i.e., phone number can appear before username or username can appear before phone number.

2) Two contacts are same if they have either same username or email or phone number.

Example:

```Input: contact[] =
{ {"Gaurav", "[email protected]", "[email protected]"},
{ "Lucky", "[email protected]", "+1234567"},
{ "gaurav123", "+5412312", "[email protected]"}.
{ "gaurav1993", "+5412312", "[email protected]"}
}
Output:
0 2 3
1
contact[2] is same as contact[3] because they both have same
contact number.
contact[0] is same as contact[3] because they both have same
Therefore, contact[0] and contact[2] are also same.
```

We strongly recommend you to minimize your browser and try this yourself first.
Input is basically an array of structures. A structure contains three fields such that any field can represent any detail about a contact.

The idea is to first create a graph of contacts using given array. In the graph, there is an edge between vertex i to vertex j if they both have either same username or same email or same phone number. Once the graph is constructed, the task reduces to finding connected components in an undirected graph. We can find connected components either by doing DFS or BFS starting from every unvisited vertex. In below code, DFS is used.

Below is implementation of this idea.

## C++

 `// A C++ program to find same contacts in a list of contacts ` `#include ` `using` `namespace` `std; ` ` `  `// Structure for storing contact details. ` `struct` `contact ` `{ ` `    ``string field1, field2, field3; ` `}; ` ` `  `// A utility function to fill entries in adjacency matrix ` `// representation of graph ` `void` `buildGraph(contact arr[], ``int` `n, ``int` `*mat[]) ` `{ ` `    ``// Initialize the adjacency matrix ` `    ``for` `(``int` `i=0; i& sol, ``int` `n) ` `{ ` `    ``visited[i] = ``true``; ` `    ``sol.push_back(i); ` ` `  `    ``for` `(``int` `j = 0; j < n; j++) ` `        ``if` `(mat[i][j] && !visited[j]) ` `            ``DFSvisit(j, mat, visited, sol, n); ` `} ` ` `  `// Finds similar contacrs in an array of contacts ` `void` `findSameContacts(contact arr[], ``int` `n) ` `{ ` `    ``// vector for storing the solution ` `    ``vector<``int``> sol; ` ` `  `    ``// Declare 2D adjaceny matrix for mats ` `    ``int` `**mat = ``new` `int``*[n]; ` ` `  `    ``for` `(``int` `i = 0; i < n; i++) ` `        ``mat[i] = ``new` `int``[n]; ` ` `  `    ``// visited array to keep track of visited nodes ` `    ``bool` `visited[n]; ` `    ``memset``(visited, 0, ``sizeof``(visited)); ` ` `  `    ``// Fill adjacency matrix ` `    ``buildGraph(arr, n, mat); ` ` `  `    ``// Since, we made a graph with contacts as nodes with fields as links. ` `    ``// two nodes are linked if they represent the same person. ` `    ``// so, total number of connected components and nodes in each component ` `    ``// will be our answer. ` `    ``for` `(``int` `i = 0; i < n; i++) ` `    ``{ ` `        ``if` `(!visited[i]) ` `        ``{ ` `            ``DFSvisit(i, mat, visited, sol, n); ` ` `  `            ``// Add delimeter to separate nodes of one component from other. ` `            ``sol.push_back(-1); ` `        ``} ` `    ``} ` ` `  `    ``// Print the solution ` `    ``for` `(``int` `i = 0; i < sol.size(); i++) ` `        ``if` `(sol[i] == -1) cout << endl; ` `        ``else` `cout << sol[i] << ``" "``; ` `} ` ` `  `// Drive program ` `int` `main() ` `{ ` `    ``contact arr[] = {{``"Gaurav"``, ``"[email protected]"``, ``"[email protected]"``}, ` `                     ``{``"Lucky"``, ``"[email protected]"``, ``"+1234567"``}, ` `                     ``{``"gaurav123"``, ``"+5412312"``, ``"[email protected]"``}, ` `                     ``{``"gaurav1993"``, ``"+5412312"``, ``"[email protected]"``}, ` `                     ``{``"raja"``, ``"+2231210"``, ``"[email protected]"``}, ` `                     ``{``"bahubali"``, ``"+878312"``, ``"raja"``} ` `                    ``}; ` ` `  `    ``int` `n = ``sizeof` `arr / ``sizeof` `arr[0]; ` `    ``findSameContacts(arr, n); ` `    ``return` `0; ` `} `

## Python3

 `# A Python3 program to find same contacts ` `# in a list of contacts  ` ` `  `# Structure for storing contact details.  ` `class` `contact: ` `    ``def` `__init__(``self``, field1,  ` `                       ``field2, field3): ` `        ``self``.field1 ``=` `field1 ` `        ``self``.field2 ``=` `field2 ` `        ``self``.field3 ``=` `field3 ` ` `  `# A utility function to fill entries in  ` `# adjacency matrix representation of graph  ` `def` `buildGraph(arr, n, mat): ` `     `  `    ``# Initialize the adjacency matrix ` `    ``for` `i ``in` `range``(n): ` `        ``for` `j ``in` `range``(n): ` `            ``mat[i][j] ``=` `0` ` `  `    ``# Traverse through all contacts  ` `    ``for` `i ``in` `range``(n): ` ` `  `        ``# Add mat from i to j and vice versa,  ` `        ``# if possible. Since length of each  ` `        ``# contact field is at max some constant. ` `        ``# (say 30) so body execution of this for  ` `        ``# loop takes constant time. ` `        ``for` `j ``in` `range``(i ``+` `1``, n): ` `            ``if` `(arr[i].field1 ``=``=` `arr[j].field1 ``or`  `                ``arr[i].field1 ``=``=` `arr[j].field2 ``or`  `                ``arr[i].field1 ``=``=` `arr[j].field3 ``or`  `                ``arr[i].field2 ``=``=` `arr[j].field1 ``or`  `                ``arr[i].field2 ``=``=` `arr[j].field2 ``or`  `                ``arr[i].field2 ``=``=` `arr[j].field3 ``or`  `                ``arr[i].field3 ``=``=` `arr[j].field1 ``or`  `                ``arr[i].field3 ``=``=` `arr[j].field2 ``or`  `                ``arr[i].field3 ``=``=` `arr[j].field3): ` `                ``mat[i][j] ``=` `1` `                ``mat[j][i] ``=` `1` `                ``break` ` `  `# A recuesive function to perform DFS  ` `# with vertex i as source  ` `def` `DFSvisit(i, mat, visited, sol, n): ` `    ``visited[i] ``=` `True` `    ``sol.append(i)  ` ` `  `    ``for` `j ``in` `range``(n): ` `        ``if` `(mat[i][j] ``and` `not` `visited[j]): ` `            ``DFSvisit(j, mat, visited, sol, n) ` ` `  `# Finds similar contacrs in an ` `# array of contacts  ` `def` `findSameContacts(arr, n): ` `     `  `    ``# vector for storing the solution  ` `    ``sol ``=` `[] ` ` `  `    ``# Declare 2D adjaceny matrix for mats  ` `    ``mat ``=` `[[``None``] ``*` `n ``for` `i ``in` `range``(n)]  ` ` `  `    ``# visited array to keep track ` `    ``# of visited nodes  ` `    ``visited ``=` `[``0``] ``*` `n ` ` `  `    ``# Fill adjacency matrix  ` `    ``buildGraph(arr, n, mat)  ` ` `  `    ``# Since, we made a graph with contacts   ` `    ``# as nodes with fields as links. Two  ` `    ``# nodes are linked if they represent ` `    ``# the same person. So, total number of  ` `    ``# connected components and nodes in each ` `    ``# component will be our answer. ` `    ``for` `i ``in` `range``(n): ` `        ``if` `(``not` `visited[i]): ` `            ``DFSvisit(i, mat, visited, sol, n)  ` ` `  `            ``# Add delimeter to separate nodes ` `            ``# of one component from other.  ` `            ``sol.append(``-``1``) ` ` `  `    ``# Prthe solution ` `    ``for` `i ``in` `range``(``len``(sol)): ` `        ``if` `(sol[i] ``=``=` `-``1``): ` `            ``print``() ` `        ``else``: ` `            ``print``(sol[i], end ``=` `" "``) ` ` `  `# Driver Code  ` `if` `__name__ ``=``=` `'__main__'``:  ` `    ``arr ``=` `[contact(``"Gaurav"``, ``"[email protected]"``, ``"[email protected]"``),  ` `           ``contact(``"Lucky"``, ``"[email protected]"``, ``"+1234567"``),  ` `           ``contact(``"gaurav123"``, ``"+5412312"``, ``"[email protected]"``),  ` `           ``contact(``"gaurav1993"``, ``"+5412312"``, ``"[email protected]"``),  ` `           ``contact(``"raja"``, ``"+2231210"``, ``"[email protected]"``), ` `           ``contact(``"bahubali"``, ``"+878312"``, ``"raja"``)] ` ` `  `    ``n ``=` `len``(arr)  ` `    ``findSameContacts(arr, n) ` ` `  `# This code is contributed by PranchalK `

Output:

```0 3 2
1
4 5```

Time complexity: O(n2) where n is number of contacts.

Thanks to Gaurav Ahirwar for above solution.

## tags:

Graph BFS DFS DFS Graph BFS