题目传送门
洛谷 P2814 家谱
思路
水的典型的并查集题目,但在建立关系时需要有一定的思考,因为名字都是字符串,所以这里采用了map
以建立名字和名字之间的关系
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <map>
using namespace std;
map<string, string> persons;
string s, t, p;
string zuisu(string x) { if (persons[x] == x) { return x; } return persons[x] = zuisu(persons[x]); }
void f(string x, string y) { string xx = zuisu(x); if (xx != y) persons[y] = xx; }
int main() { while (cin >> s && s != "$") { if (s[0] == '#') { t = s.substr(1); if (persons[t] == "") { persons[t] = t; } } else if (s[0] == '+') { p = s.substr(1); f(t, p); } else if (s[0] == '?') { p = s.substr(1); zuisu(p); cout << p << " " << persons[p] << endl; } } return 0; }
|