Problem
https://leetcode.com/problems/accounts-merge/
Answer
class Solution {
public:
vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
unordered_map<string, vector<string>> names;
unordered_map<string, vector<string>> graph;
vector<vector<string>> res;
for (auto& account : accounts) {
int n = account.size();
string name = account[0];
for (int i = 1; i < n; ++i) {
string mail = account[i];
names[name].push_back(mail);
if (graph.count(account[i]) == 0) {
graph[account[i]] = vector<string>();
}
if (i == 1) continue;
graph[account[i]].push_back(account[i-1]);
graph[account[i-1]].push_back(account[i]);
}
}
unordered_set<string> visited;
for (auto& it : names) {
vector<string> allAdds = it.second;
for (auto& each : allAdds) {
if (visited.count(each) != 0) continue;
vector<string> list;
list.push_back(it.first);
visited.insert(each);
DFS(graph, visited, each, list);
sort(list.begin(), list.end());
res.push_back(list);
}
}
return res;
}
void DFS(unordered_map<string, vector<string>>& graph, unordered_set<string>& visited, string& account, vector<string>& list) {
list.push_back(account);
for (string &next : graph[account]) {
if (visited.count(next) != 0) continue;
visited.insert(next);
DFS(graph, visited, next, list);
}
}
};