1,根据并查集对每一行关联到其父节点(一个int值,相同则表示关联),先以行数作为父节点,相关联的行数的父节点改为同一个。
for (int i = 0; i < n; i++)
{
f.push_back(i);//初始化每组的父节点为行号
}
2,使用map将每个email关联到这一行,实际行数
for (int i = 1; i < accounts[0].size(); i++)
/*第一行直接写入*/
{
m[accounts[0][i]] = 0;
}
for (int i = 1; i < n; i++)
{
for (int j = 1; j < accounts[i].size(); j++)
{
if (m.find(accounts[i][j]) != m.end())//如果m中存在这个邮箱
{
/*m[accounts[i][j]]行与i行,为同一行,将父节点设为同一个*/
}
else
m[accounts[i][j]] = i;//这个email之前不存在,插入到email集合中
}
}
5,最后遍历email集合,根据email对应的行号row,如果f[row]相同,说明这两行为同一个父节点。
map<int, vector<string>> km;//int为父节点
for (it = m.begin(); it != m.end(); it++)
{
/*
*这里k为父节点的数值,相同表示相连
*it->second为email对应的真正行数
*map第一个值为父节点,如果相同,就插入到同一个vector中
*/
int k = f(it->second);
if (km.find(k) == km.end())
km[k].push_back(accounts[it->second][0]);//如果这个节点没有插入,先获取到名字
km[k].push_back(it->first);
}
map中每一个int对应的vector为一个账户。