自己昨晚突发奇想写得,有些复杂。
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
using namespace std;
const int Maxn = int(5e4) + 4;
map<string/*儿子*/, string/*爸爸*/> member;
map<int/*编号*/, string/*人物*/> Linking;//链接并查集和map的map
int Relative[Maxn];//并查集
//以下都是对并查集的操作
void Init()
{
for(int i = 1; i <= Maxn; i++)
Relative[i] = i;
}
int Find(int x)
{
return x == Relative[x] ? x : Find(Relative[x]);
}
void Union(int x, int y)
{
x = Find(x);
y = Find(y);
if(x != y)
Relative[x] = Relative[y];
}
int main()
{
int i = 0, Father;
char sign;
string name, father;
Init();
scanf("%c", &sign);
while(sign != '$' && ++i)
{
cin >> name;
switch(sign)
{
case '#':
Father = i;//定父亲位置
father = name;//记录父亲名字
Linking[i] = name;//找到连接点
//因为Father是值,所以不对其进行操作
#if 0
printf("\n对父亲的操作已做\n\n");
#endif
break;
case '+':
Union(i, Father);//归属父亲部下
Linking[i] = name;//找到连接点
member[name] = father;//由儿子映射到父亲
#if 0
printf("\n对儿子的操作已做\n\n");
#endif
break;
case '?':
cout << name << " " << member[name];
#if 0
printf("\n输出操作已做\n\n");
#endif
break;
}
}
return 0;
}