#include <iostream>
# include <bits/stdc++.h>
using namespace std;
class DSU
{
public :
vector<int> parent;
vector<int> size;
DSU (int n)
{
parent.resize(n);
size.resize(n,1);
for(int i=0;i<n;i++)
{
parent[i] = i;
}
}
int findParent(int x)
{
if(parent[x]==x)
return x;
else
{
parent[x] = findParent(parent[x]);
return parent[x];
}
}
void unionBySize(int x,int y)
{
int parentX = findParent(x);
int parentY = findParent(y);
if(parentX == parentY)
return;
if(size[parentX] > size[parentY])
{
parent[parentY] = parentX;
size[parentX] += size[parentY];
}
else
{
parent[parentX] = parentY;
size[parentY] += size[parentX];
}
}
};
int minTime (vector<vector<int>> logs,int distinctN)
{
int n = logs.size();
int minTime = -1;
DSU dsu(distinctN);
for(int i=0;i<n;i++)
{
int time = logs[i][0];
int x= logs[i][1];
int y= logs[i][2];
dsu.unionBySize(x,y);
if(dsu.size[dsu.findParent(x)]==distinctN)
return time;
}
return minTime;
}
int main() {
// Test 1: Example case
vector<vector<int>> logs1 = {
{2, 0, 1},
{3, 1, 2},
{4, 2, 3}
};
unordered_set<int> set;
for(auto it : logs1)
{
set.insert(it[1]);
set.insert(it[2]);
}
cout << "Test 1: " << minTime(logs1, set.size()) << " (Expected: 4)\n";
// Test 2: Already connected late
vector<vector<int>> logs2 = {
{5, 0, 1},
{6, 1, 2},
{7, 2, 3}
};
cout << "Test 2: " << minTime(logs2, 4) << " (Expected: 7)\n";
// Test 3: Never fully connected
vector<vector<int>> logs3 = {
{1, 0, 1},
{2, 2, 3}
};
cout << "Test 3: " << minTime(logs3, 4) << " (Expected: -1)\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojIGluY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBEU1UKCnsKCXB1YmxpYyA6Cgl2ZWN0b3I8aW50PiBwYXJlbnQ7Cgl2ZWN0b3I8aW50PiBzaXplOwoJCglEU1UgKGludCBuKQoJewoJCXBhcmVudC5yZXNpemUobik7CgkJc2l6ZS5yZXNpemUobiwxKTsKCQlmb3IoaW50IGk9MDtpPG47aSsrKQoJCXsKCQkJcGFyZW50W2ldID0gaTsKCQl9Cgl9CgkKCWludCBmaW5kUGFyZW50KGludCB4KQoJewoJCWlmKHBhcmVudFt4XT09eCkKCQlyZXR1cm4geDsKCQllbHNlCgkJewoJCQlwYXJlbnRbeF0gPSBmaW5kUGFyZW50KHBhcmVudFt4XSk7CgkJCXJldHVybiBwYXJlbnRbeF07CgkJfQoJfQoJCgl2b2lkIHVuaW9uQnlTaXplKGludCB4LGludCB5KQoJewoJCWludCBwYXJlbnRYID0gZmluZFBhcmVudCh4KTsKCQlpbnQgcGFyZW50WSA9IGZpbmRQYXJlbnQoeSk7CgkJaWYocGFyZW50WCA9PSBwYXJlbnRZKQoJCXJldHVybjsKCQlpZihzaXplW3BhcmVudFhdID4gc2l6ZVtwYXJlbnRZXSkKCQl7CgkJCXBhcmVudFtwYXJlbnRZXSA9IHBhcmVudFg7CgkJCXNpemVbcGFyZW50WF0gKz0gc2l6ZVtwYXJlbnRZXTsKCQl9CgkJZWxzZQoJCXsKCQkJcGFyZW50W3BhcmVudFhdID0gcGFyZW50WTsKCQkJc2l6ZVtwYXJlbnRZXSArPSBzaXplW3BhcmVudFhdOwkKCQl9Cgl9CgkKfTsKCmludCBtaW5UaW1lICh2ZWN0b3I8dmVjdG9yPGludD4+IGxvZ3MsaW50IGRpc3RpbmN0TikKewoJaW50IG4gPSBsb2dzLnNpemUoKTsKCWludCBtaW5UaW1lID0gLTE7CglEU1UgZHN1KGRpc3RpbmN0Tik7CgkKCWZvcihpbnQgaT0wO2k8bjtpKyspCgl7CgkJaW50IHRpbWUgPSBsb2dzW2ldWzBdOwoJCWludCB4PSBsb2dzW2ldWzFdOwoJCWludCB5PSBsb2dzW2ldWzJdOwoJCWRzdS51bmlvbkJ5U2l6ZSh4LHkpOwoJCQoJCWlmKGRzdS5zaXplW2RzdS5maW5kUGFyZW50KHgpXT09ZGlzdGluY3ROKQoJCXJldHVybiB0aW1lOwoJCQoJCQoJfQoJcmV0dXJuIG1pblRpbWU7Cn0KCmludCBtYWluKCkgewoJIC8vIFRlc3QgMTogRXhhbXBsZSBjYXNlCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGxvZ3MxID0gewogICAgICAgIHsyLCAwLCAxfSwKICAgICAgICB7MywgMSwgMn0sCiAgICAgICAgezQsIDIsIDN9CiAgICB9OwogICAgdW5vcmRlcmVkX3NldDxpbnQ+IHNldDsKICAgIGZvcihhdXRvIGl0IDogbG9nczEpCiAgICB7CiAgICAJc2V0Lmluc2VydChpdFsxXSk7CiAgICAJc2V0Lmluc2VydChpdFsyXSk7CiAgICB9CiAgICBjb3V0IDw8ICJUZXN0IDE6ICIgPDwgbWluVGltZShsb2dzMSwgc2V0LnNpemUoKSkgPDwgIiAoRXhwZWN0ZWQ6IDQpXG4iOwoKICAgIC8vIFRlc3QgMjogQWxyZWFkeSBjb25uZWN0ZWQgbGF0ZQogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBsb2dzMiA9IHsKICAgICAgICB7NSwgMCwgMX0sCiAgICAgICAgezYsIDEsIDJ9LAogICAgICAgIHs3LCAyLCAzfQogICAgfTsKICAgIGNvdXQgPDwgIlRlc3QgMjogIiA8PCBtaW5UaW1lKGxvZ3MyLCA0KSA8PCAiIChFeHBlY3RlZDogNylcbiI7CgogICAgLy8gVGVzdCAzOiBOZXZlciBmdWxseSBjb25uZWN0ZWQKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gbG9nczMgPSB7CiAgICAgICAgezEsIDAsIDF9LAogICAgICAgIHsyLCAyLCAzfQogICAgfTsKICAgIGNvdXQgPDwgIlRlc3QgMzogIiA8PCBtaW5UaW1lKGxvZ3MzLCA0KSA8PCAiIChFeHBlY3RlZDogLTEpXG4iOwp9