问题描述
锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻
天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误
……
在卡勒沃夫充满文学杀伤力的声音中,身处紫荆2号楼202B的四位远近高低各不同的室友纷纷回忆起了各自波澜起伏的过去,并对长在百草园,邻有百花谷的现状表达了各自的见解。
某Q:”…我小学就开窍了…她的父母说我很好,但是…今天又和北林的联系了…”
某X:”…差点就成了,结果到学校了…这个方法放假了我去对我的同桌用!…”
某W:”…”(千言万语不言中,有大量的故事等待考古)
某Z:”…为了来清华…咱们审美观不一样,不会抢…”
……
卡勒沃夫在这个不朽的夜话中搜集出了某人零散的历任女友资料,为了强迫某人将他出的题目的标程交出,现在卡勒沃夫需要一个能将这些零散信息整合起来的程序。伴随着雄壮委婉动人的音乐,身为程序设计快男(超女)的你降临了!卡勒沃夫正对着您做Orz状并请求着:”神牛啊~请施舍给我一段程序把~偶米头发~”。。
输入格式
第一行为一个不超过5的整数T,表示数据的组数。之后每组数据的一行为一个不超过100的整数n。之后n行每行有两个用单个空格隔开的字符串(每个字符串只有英文大小写字母,长度不超过10),为两位mm的名字。每行第一个mm先于第二个mm成为某人的女友。
在这里我们假装诅咒某人不会同时被两个或两个以上mm泡,某个mm抛弃了某人后不会再吃回头草,同时卡勒沃夫深邃的洞察力使得他收集到了充足的信息以确定某人女友的先后顺序。
在小数据组中出现的人物不超过13个
输出格式
输出T行,每行对应一组数据,并按照mm们从先到后成为某人女友的顺序输出她们的名字,各个名字间用一个空格隔开。
样例输入
2
2
RY Unknown
YSZ RY
3
tomorrow yestoday
tomorrow today
today yestoday
样例输出
YSZ RY Unknown
tomorrow today yestoday
分析:1.用girl映射到一组girl,为某个女孩映射到前面有哪些女孩
2.如果某个女孩前面没有女孩,并且没有被输出过,则输出当前女孩并标记,并且,将其从其他所有女孩的映射中擦除
3.重复2过程,直到所有女孩被输出~
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 |
#include <iostream> #include <algorithm> #include <set> #include <map> using namespace std; int main() { int k, n; cin >> k; while (k--) { string ans = ""; cin >> n; map<string, set<string> > m; map<string, int> vis; for (int i = 0; i < n; i++) { string s1, s2; cin >> s1 >> s2; m[s1]; m[s2].insert(s1); } while (1) { int check = 0; for (map<string, set<string> >::iterator i = m.begin(); i != m.end(); i++) { string girl = i->first; if (vis[girl] == 0 && m[girl].size() == 0) { check = 1; vis[girl] = 1; for (map<string, set<string> >::iterator j = m.begin(); j != m.end(); j++) { j->second.erase(girl); } ans = ans + girl + " "; break; } } if (check == 0) break; } cout << ans.substr(0, ans.length() - 1) << endl; } return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼