Pagini recente » Cod sursa (job #1032468) | Cod sursa (job #2046112) | Cod sursa (job #132382) | Cod sursa (job #2056152) | Cod sursa (job #1760449)
#include <fstream>
#include <vector>
#include <algorithm>
#include <list>
#include <unordered_map>
#include <utility>
struct file_manip {
std::ifstream fin;
std::ofstream fout;
file_manip(const char* filename) {
std::string infilename = std::string(filename) + ".in";
std::string outfilename = std::string(filename) + ".out";
fin.open(infilename.c_str());
fout.open(outfilename.c_str());
}
template <class T>
file_manip& operator << (const T& rhs) {
fout << rhs;
return *this;
}
template <class T>
file_manip& operator >> (T& rhs) {
fin >> rhs;
return *this;
}
};
struct DS
{
std::unordered_map<int, std::list<int>> forrest;
std::vector<int> indices;
DS(int N)
{
indices.reserve(N+1);
int x = 0;
std::generate_n(indices.begin(), N + 1, [&x]() { return x++;});
x = 1;
for (x = 1; x <= N; ++x)
{
std::list<int> s{x};
forrest[x] = s;
}
}
void Associate(int x, int y)
{
const auto id1 = indices[x];
const auto id2 = indices[y];
if (id1 == id2)
return;
auto& s1 = forrest[id1];
auto& s2 = forrest[id2];
for (const auto i : s2){
indices[i] = id1;
}
s1.splice(s1.end(), s2);
}
bool AreTheSame(int x, int y) const
{
return indices[x] == indices[y];
}
};
int main()
{
file_manip fm("disjoint");
int N, M, op, x, y;
fm >> N >> M;
DS ds(N);
while (M--)
{
fm >> op >> x >> y;
if (op == 1){
ds.Associate(x,y);
}
else {
if (ds.AreTheSame(x,y))
{
fm << "DA\n";
}
else
{
fm << "NU\n";
}
}
}
return 0;
}