Pagini recente » Cod sursa (job #2815419) | Cod sursa (job #1634849) | Cod sursa (job #1147124) | Cod sursa (job #1235239) | Cod sursa (job #1609265)
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <unordered_map>
using namespace std;
ifstream in("brazi.in");
ofstream out("brazi.out");
bool checkSimilar(vector<vector<int>>& a, vector<vector<int>>& b, int nodA, int nodB)
{
if (nodA == 0 && nodB == 0)
return true;
if ((nodA == 0 && nodB != 0) || (nodA != 0 && nodB == 0))
return false;
return checkSimilar(a, b, a[nodA][0], b[nodB][0]) &&
checkSimilar(a, b, a[nodA][1], b[nodB][1]);
}
void generateCodes(vector<vector<int>>& brad, int rad, string& code)
{
if (brad[rad][0] != 0)
{
code += "0";
generateCodes(brad, brad[rad][0], code);
}
if (brad[rad][1] != 0)
{
code += "1";
generateCodes(brad, brad[rad][1], code);
}
code += "2";
}
int main()
{
int T;
in >> T;
vector<vector<vector<int>>> brazi;
vector<int> radacini(T);
for (int k = 0; k < T; k++)
{
int N;
in >> N;
vector<vector<int>> graf(N+1, vector<int>(2,0));
vector<int> grad(N+1, 0);
for (int i = 0; i < N-1; i++)
{
int x, y, t;
in >> x >> y >> t;
grad[y]++;
if (t == 0)
{
graf[x][0] = y;
}
else
{
graf[x][1] = y;
}
}
brazi.push_back(graf);
for (int i = 1; i < grad.size(); i++)
if (grad[i] == 0)
{
radacini[k] = i;
break;
}
}
vector<string> codes(T);
for (int i = 0; i < T; i++)
{
string currentCode;
generateCodes(brazi[i], radacini[i], currentCode);
codes[i] = currentCode;
}
// for (int i = 0; i < T; i++)
// cout << codes[i] << " ";
unordered_map<string, int> appearances;
out << "0\n";
appearances[codes[0]] = 1;
for (int i = 1; i < T; i++)
{
if (appearances.find(codes[i]) != appearances.end())
{
out << appearances[codes[i]] << "\n";
appearances[codes[i]]++;
}
else{
out << "0" << "\n";
appearances[codes[i]] = 1;
}
}
return 0;
}