undirected-tree-validator.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "testlib.h"
  2. #include <vector>
  3. #include <set>
  4. using namespace std;
  5. int leader(vector<int>& dsu, int idx)
  6. {
  7. return dsu[idx] == idx ? dsu[idx] : (dsu[idx] = leader(dsu, dsu[idx]));
  8. }
  9. bool merge(vector<int>& dsu, int a, int b)
  10. {
  11. a = leader(dsu, a);
  12. b = leader(dsu, b);
  13. if (a == b)
  14. return false;
  15. else
  16. {
  17. if (rnd.next(2) == 0)
  18. dsu[a] = b;
  19. else
  20. dsu[b] = a;
  21. return true;
  22. }
  23. }
  24. int main(int argc, char* argv[])
  25. {
  26. registerValidation(argc, argv);
  27. int n = inf.readInt(2, 100000, "n");
  28. inf.readEoln();
  29. vector<int> dsu(n);
  30. for (int i = 0; i < n; i++)
  31. dsu[i] = i;
  32. set<pair<int,int> > edges;
  33. for (int i = 0; i < n - 1; i++)
  34. {
  35. int x = inf.readInt(1, n, "x_i");
  36. inf.readSpace();
  37. int y = inf.readInt(1, n, "y_i");
  38. inf.readEoln();
  39. ensuref(x != y, "Tree can't contain loops");
  40. ensuref(edges.count(make_pair(x, y)) == 0, "Tree can't contain multiple edges between a pair of vertices");
  41. edges.insert(make_pair(x, y));
  42. edges.insert(make_pair(y, x));
  43. ensuref(merge(dsu, x - 1, y - 1), "Tree can't contain cycles");
  44. }
  45. inf.readEof();
  46. return 0;
  47. }