#include<iostream>
#include<vector>
#include<sstream>
#include<fstream>
#include <unordered_map>
#include <utility>
#include<queue>
using namespace std;
struct Match {
string Hometeam;
vector<string> Homesquad;
string Homecountry;
string Vistorteams;
vector<string> Vistorsquad;
string vistorcountry;
string date;
string score;
int spectators;
string stadium, stadiumcountry, leauge;
};
vector<string> get_player(string line) {
stringstream ss(line);
string s;
vector<string> v;
while (getline(ss, s, ';')) {
v.push_back(s);
}
return v;
}
Match readline(string line) {
stringstream ss(line);
string s;
Match m;
getline(ss, s, ',');
m.Hometeam = s;
getline(ss, s, ',');
m.Homesquad = get_player(s);
getline(ss, s, ',');
m.Homecountry = s;
getline(ss, s, ',');
m.Vistorteams = s;
getline(ss, s, ',');
m.Vistorsquad = get_player(s);
getline(ss, s, ',');
m.vistorcountry = s;
getline(ss, s, ',');
m.date = s;
getline(ss, s, ',');
m.score = s;
getline(ss, s, ',');
m.spectators = stoi(s);
getline(ss, s, ',');
m.stadium = s;
getline(ss, s, ',');
m.stadiumcountry = s;
getline(ss, s, ',');
m.leauge = s;
return m;
}
vector<Match> readfile(string filename) {
ifstream fi(filename);
if (!fi) {
cout << "cannot read file!!";
return{};
}
string line;
getline(fi, line);
vector<Match> v;
while (getline(fi, line)) {
Match m = readline(line);
v.push_back(m);
}
fi.close();
return v;
}
struct team{
string name;
vector<string> squad;
};
struct graph {
vector<team> T;
vector<vector<int>> adjlist;
};
unordered_map<string, int>mp;
int numteam = 0;
vector<team> matches_to_team(vector<Match> m) {
vector<team> v;
for (Match i : m) {
if (mp.find(i.Hometeam) == mp.end()) {
mp[i.Hometeam] = numteam++;
v.push_back({ i.Hometeam, i.Homesquad });
}
if (mp.find(i.Vistorteams) == mp.end()) {
mp[i.Vistorteams] = numteam++;
v.push_back({ i.Vistorteams ,i.Vistorsquad });
}
}
return v;
}
team idx_to_team(int i, vector<team>& T) {
return T[i];
}
graph buildgraph(vector<Match> M) {
graph G;
G.T = matches_to_team(M);
G.adjlist.assign(G.T.size(), vector<int>());
for (Match m : M) {
G.adjlist[mp[m.Hometeam]].push_back(mp[m.Vistorteams]);
}
return G;
}
void bfs(graph& G, int sta , vector<int>& v, vector<bool>& vis) {
queue<int> q;
q.push(sta);
vis[sta] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
v.push_back(u);
for (int v : G.adjlist[u]) {
if (!vis[v]) {
vis[v] = true;
q.push(v);
}
}
}
}
int main() {
string filename = "inp.txt";
vector<Match> m = readfile(filename);
graph G = buildgraph(m);
vector<int> v;
vector<bool> vis(G.T.size(), false);
for (int i = 0; i < G.T.size(); i++) {
if (!vis[i]) {
bfs(G, i, v, vis);
}
}
for (int i : v) {
cout << idx_to_team(i, G.T).name << endl;
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8c3N0cmVhbT4KI2luY2x1ZGU8ZnN0cmVhbT4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZTxxdWV1ZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBNYXRjaCB7CglzdHJpbmcgSG9tZXRlYW07Cgl2ZWN0b3I8c3RyaW5nPiBIb21lc3F1YWQ7CglzdHJpbmcgSG9tZWNvdW50cnk7CglzdHJpbmcgVmlzdG9ydGVhbXM7Cgl2ZWN0b3I8c3RyaW5nPiBWaXN0b3JzcXVhZDsKCXN0cmluZyB2aXN0b3Jjb3VudHJ5OwoJc3RyaW5nIGRhdGU7CglzdHJpbmcgc2NvcmU7CglpbnQgc3BlY3RhdG9yczsKCXN0cmluZyBzdGFkaXVtLCBzdGFkaXVtY291bnRyeSwgbGVhdWdlOwoKfTsKdmVjdG9yPHN0cmluZz4gZ2V0X3BsYXllcihzdHJpbmcgbGluZSkgewoJc3RyaW5nc3RyZWFtIHNzKGxpbmUpOwoJc3RyaW5nIHM7Cgl2ZWN0b3I8c3RyaW5nPiB2OwoJd2hpbGUgKGdldGxpbmUoc3MsIHMsICc7JykpIHsKCQl2LnB1c2hfYmFjayhzKTsKCX0KCXJldHVybiB2Owp9Ck1hdGNoIHJlYWRsaW5lKHN0cmluZyBsaW5lKSB7CglzdHJpbmdzdHJlYW0gc3MobGluZSk7CglzdHJpbmcgczsKCU1hdGNoIG07CglnZXRsaW5lKHNzLCBzLCAnLCcpOwoJbS5Ib21ldGVhbSA9IHM7CglnZXRsaW5lKHNzLCBzLCAnLCcpOwoJbS5Ib21lc3F1YWQgPSBnZXRfcGxheWVyKHMpOwoJZ2V0bGluZShzcywgcywgJywnKTsKCW0uSG9tZWNvdW50cnkgPSBzOwoJZ2V0bGluZShzcywgcywgJywnKTsKCW0uVmlzdG9ydGVhbXMgPSBzOwoJZ2V0bGluZShzcywgcywgJywnKTsKCW0uVmlzdG9yc3F1YWQgPSBnZXRfcGxheWVyKHMpOwoJZ2V0bGluZShzcywgcywgJywnKTsKCW0udmlzdG9yY291bnRyeSA9IHM7CglnZXRsaW5lKHNzLCBzLCAnLCcpOwoJbS5kYXRlID0gczsKCWdldGxpbmUoc3MsIHMsICcsJyk7CgltLnNjb3JlID0gczsKCWdldGxpbmUoc3MsIHMsICcsJyk7CgltLnNwZWN0YXRvcnMgPSBzdG9pKHMpOwoJZ2V0bGluZShzcywgcywgJywnKTsKCW0uc3RhZGl1bSA9IHM7CglnZXRsaW5lKHNzLCBzLCAnLCcpOwoJbS5zdGFkaXVtY291bnRyeSA9IHM7CglnZXRsaW5lKHNzLCBzLCAnLCcpOwoJbS5sZWF1Z2UgPSBzOwoJcmV0dXJuIG07Cn0KdmVjdG9yPE1hdGNoPiByZWFkZmlsZShzdHJpbmcgZmlsZW5hbWUpIHsKCWlmc3RyZWFtIGZpKGZpbGVuYW1lKTsKCWlmICghZmkpIHsKCQljb3V0IDw8ICJjYW5ub3QgcmVhZCBmaWxlISEiOwoJCXJldHVybnt9OwoJfQoJc3RyaW5nIGxpbmU7CglnZXRsaW5lKGZpLCBsaW5lKTsKCXZlY3RvcjxNYXRjaD4gdjsKCXdoaWxlIChnZXRsaW5lKGZpLCBsaW5lKSkgewoJCU1hdGNoIG0gPSByZWFkbGluZShsaW5lKTsKCQl2LnB1c2hfYmFjayhtKTsKCX0KCWZpLmNsb3NlKCk7CglyZXR1cm4gdjsKCn0Kc3RydWN0IHRlYW17CglzdHJpbmcgbmFtZTsKCXZlY3RvcjxzdHJpbmc+IHNxdWFkOwp9OwpzdHJ1Y3QgZ3JhcGggewoJdmVjdG9yPHRlYW0+IFQ7Cgl2ZWN0b3I8dmVjdG9yPGludD4+IGFkamxpc3Q7Cn07CnVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ+bXA7CmludCBudW10ZWFtID0gMDsKdmVjdG9yPHRlYW0+IG1hdGNoZXNfdG9fdGVhbSh2ZWN0b3I8TWF0Y2g+IG0pIHsKCXZlY3Rvcjx0ZWFtPiB2OwoJZm9yIChNYXRjaCBpIDogbSkgewoJCWlmIChtcC5maW5kKGkuSG9tZXRlYW0pID09IG1wLmVuZCgpKSB7CgkJCW1wW2kuSG9tZXRlYW1dID0gbnVtdGVhbSsrOwoJCQl2LnB1c2hfYmFjayh7IGkuSG9tZXRlYW0sIGkuSG9tZXNxdWFkIH0pOwoJCX0KCQlpZiAobXAuZmluZChpLlZpc3RvcnRlYW1zKSA9PSBtcC5lbmQoKSkgewoJCQltcFtpLlZpc3RvcnRlYW1zXSA9IG51bXRlYW0rKzsKCQkJdi5wdXNoX2JhY2soeyBpLlZpc3RvcnRlYW1zICxpLlZpc3RvcnNxdWFkIH0pOwoJCX0KCX0KCXJldHVybiB2Owp9CnRlYW0gaWR4X3RvX3RlYW0oaW50IGksIHZlY3Rvcjx0ZWFtPiYgVCkgewoJcmV0dXJuIFRbaV07Cn0KZ3JhcGggYnVpbGRncmFwaCh2ZWN0b3I8TWF0Y2g+IE0pIHsKCWdyYXBoIEc7CglHLlQgPSBtYXRjaGVzX3RvX3RlYW0oTSk7CglHLmFkamxpc3QuYXNzaWduKEcuVC5zaXplKCksIHZlY3RvcjxpbnQ+KCkpOwoJZm9yIChNYXRjaCBtIDogTSkgewoJCUcuYWRqbGlzdFttcFttLkhvbWV0ZWFtXV0ucHVzaF9iYWNrKG1wW20uVmlzdG9ydGVhbXNdKTsKCX0KCXJldHVybiBHOwp9CnZvaWQgYmZzKGdyYXBoJiBHLCBpbnQgc3RhICwgdmVjdG9yPGludD4mIHYsIHZlY3Rvcjxib29sPiYgdmlzKSB7CglxdWV1ZTxpbnQ+IHE7CglxLnB1c2goc3RhKTsKCXZpc1tzdGFdID0gdHJ1ZTsKCXdoaWxlICghcS5lbXB0eSgpKSB7CgkJaW50ICB1ID0gcS5mcm9udCgpOwoJCXEucG9wKCk7CgkJdi5wdXNoX2JhY2sodSk7CgkJZm9yIChpbnQgdiA6IEcuYWRqbGlzdFt1XSkgewoJCQlpZiAoIXZpc1t2XSkgewoJCQkJdmlzW3ZdID0gdHJ1ZTsKCQkJCXEucHVzaCh2KTsKCQkJfQoJCX0KCX0KfQppbnQgbWFpbigpIHsKCXN0cmluZyBmaWxlbmFtZSA9ICJpbnAudHh0IjsKCXZlY3RvcjxNYXRjaD4gbSA9IHJlYWRmaWxlKGZpbGVuYW1lKTsKCWdyYXBoIEcgPSBidWlsZGdyYXBoKG0pOwoKCXZlY3RvcjxpbnQ+IHY7Cgl2ZWN0b3I8Ym9vbD4gdmlzKEcuVC5zaXplKCksIGZhbHNlKTsKCglmb3IgKGludCBpID0gMDsgaSA8IEcuVC5zaXplKCk7IGkrKykgewoJCWlmICghdmlzW2ldKSB7CgkJCWJmcyhHLCBpLCB2LCB2aXMpOwoJCX0KCX0KCglmb3IgKGludCBpIDogdikgewoJCWNvdXQgPDwgaWR4X3RvX3RlYW0oaSwgRy5UKS5uYW1lIDw8IGVuZGw7Cgl9Cn0=