#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool allNodesReachablefromZero(int maxWeightofEdge, vector<vector<int>> &edges,int countNodes)
{
vector<vector<int>> adj (countNodes);
vector<int> visited (countNodes,0);
for(int i=0;i<edges.size();i++)
{
int x = edges[i][0];
int y = edges[i][1];
int weight = edges[i][2];
if(weight<=maxWeightofEdge)
{
adj[y].push_back(x);
}
}
queue<int> q;
q.push(0);
visited[0]=1;
while(q.size()>0)
{
int node = q.front();
q.pop();
for(int i=0;i<adj[node].size();i++)
{
if(visited[adj[node][i]]==0)
{
visited[adj[node][i]] =1;
q.push(adj[node][i]);
}
}
}
for(int i=0;i<countNodes;i++)
{
if(visited[i]==0)
return false;
}
return true;
}
int maxWeight(int n,int threshold,vector<vector<int>> & edges)
{
if(n<=1)
return 0;
int minW = INT_MAX;
int maxW = INT_MIN;
if(threshold==0)
return -1;
for(int i=0;i<edges.size();i++)
{
if(minW>edges[i][2])
minW = edges[i][2];
if(maxW<edges[i][2])
maxW = edges[i][2];
}
//cout<<"min max are "<<min<<max;
int ans =-1;
while(minW<=maxW)
{
int mid = (minW+maxW )/2;
if(allNodesReachablefromZero(mid,edges,n))
{
ans = mid;
maxW = mid-1;
}
else
{
minW = mid+1;
}
}
return ans;
}
int main() {
// your code goes here
vector<vector<int>> test1 = {{1,0,1},{2,0,2},{3,0,1},{4,3,1},{2,1,1}};
vector<vector<int>> test2 = {{0,1,1},{0,2,2},{0,3,1},{0,4,1},{1,2,1},{1,4,1}};
cout<<maxWeight(5,2,test1);
cout<<"\n";
cout<<maxWeight(5,2,test2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmJvb2wgYWxsTm9kZXNSZWFjaGFibGVmcm9tWmVybyhpbnQgbWF4V2VpZ2h0b2ZFZGdlLCB2ZWN0b3I8dmVjdG9yPGludD4+ICZlZGdlcyxpbnQgY291bnROb2RlcykKewoJdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGogKGNvdW50Tm9kZXMpOwoJdmVjdG9yPGludD4gdmlzaXRlZCAoY291bnROb2RlcywwKTsKCWZvcihpbnQgaT0wO2k8ZWRnZXMuc2l6ZSgpO2krKykKCXsKCQlpbnQgeCA9IGVkZ2VzW2ldWzBdOwoJCWludCB5ID0gZWRnZXNbaV1bMV07CgkJaW50IHdlaWdodCA9IGVkZ2VzW2ldWzJdOwoJCWlmKHdlaWdodDw9bWF4V2VpZ2h0b2ZFZGdlKQoJCXsKCQkJYWRqW3ldLnB1c2hfYmFjayh4KTsKCQl9Cgl9CglxdWV1ZTxpbnQ+IHE7CglxLnB1c2goMCk7Cgl2aXNpdGVkWzBdPTE7Cgl3aGlsZShxLnNpemUoKT4wKQoJewoJCWludCBub2RlID0gcS5mcm9udCgpOwoJCXEucG9wKCk7CgkJZm9yKGludCBpPTA7aTxhZGpbbm9kZV0uc2l6ZSgpO2krKykKCQl7CgkJCWlmKHZpc2l0ZWRbYWRqW25vZGVdW2ldXT09MCkKCQkJewoJCQkJdmlzaXRlZFthZGpbbm9kZV1baV1dID0xOwoJCQkJcS5wdXNoKGFkaltub2RlXVtpXSk7CgkJCX0KCQl9CgkJCgl9Cglmb3IoaW50IGk9MDtpPGNvdW50Tm9kZXM7aSsrKQoJewoJCWlmKHZpc2l0ZWRbaV09PTApCgkJcmV0dXJuIGZhbHNlOwoJfQoJcmV0dXJuIHRydWU7Cn0KCmludCBtYXhXZWlnaHQoaW50IG4saW50IHRocmVzaG9sZCx2ZWN0b3I8dmVjdG9yPGludD4+ICYgZWRnZXMpCnsKCWlmKG48PTEpCglyZXR1cm4gMDsKCWludCBtaW5XID0gSU5UX01BWDsKCWludCBtYXhXID0gSU5UX01JTjsKCWlmKHRocmVzaG9sZD09MCkKCXJldHVybiAtMTsKCWZvcihpbnQgaT0wO2k8ZWRnZXMuc2l6ZSgpO2krKykKCXsKCQlpZihtaW5XPmVkZ2VzW2ldWzJdKQoJCQltaW5XID0gZWRnZXNbaV1bMl07CgkJCgkJaWYobWF4VzxlZGdlc1tpXVsyXSkKCQkJbWF4VyA9IGVkZ2VzW2ldWzJdOwoJfQoJLy9jb3V0PDwibWluIG1heCBhcmUgIjw8bWluPDxtYXg7CglpbnQgYW5zID0tMTsKCXdoaWxlKG1pblc8PW1heFcpCgl7CgkJaW50IG1pZCA9IChtaW5XK21heFcgKS8yOwoJCWlmKGFsbE5vZGVzUmVhY2hhYmxlZnJvbVplcm8obWlkLGVkZ2VzLG4pKQoJCXsKCQkJYW5zID0gbWlkOwoJCQltYXhXID0gbWlkLTE7CgkJfQoJCWVsc2UKCQl7CgkJCW1pblcgPSBtaWQrMTsKCQl9Cgl9CglyZXR1cm4gYW5zOwp9CmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJdmVjdG9yPHZlY3RvcjxpbnQ+PiB0ZXN0MSA9IHt7MSwwLDF9LHsyLDAsMn0sezMsMCwxfSx7NCwzLDF9LHsyLDEsMX19OwoJdmVjdG9yPHZlY3RvcjxpbnQ+PiB0ZXN0MiA9IHt7MCwxLDF9LHswLDIsMn0sezAsMywxfSx7MCw0LDF9LHsxLDIsMX0sezEsNCwxfX07Cgljb3V0PDxtYXhXZWlnaHQoNSwyLHRlc3QxKTsKCWNvdXQ8PCJcbiI7Cgljb3V0PDxtYXhXZWlnaHQoNSwyLHRlc3QyKTsKCXJldHVybiAwOwp9