fork download
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. bool allNodesReachablefromZero(int maxWeightofEdge, vector<vector<int>> &edges,int countNodes)
  6. {
  7. vector<vector<int>> adj (countNodes);
  8. vector<int> visited (countNodes,0);
  9. for(int i=0;i<edges.size();i++)
  10. {
  11. int x = edges[i][0];
  12. int y = edges[i][1];
  13. int weight = edges[i][2];
  14. if(weight<=maxWeightofEdge)
  15. {
  16. adj[y].push_back(x);
  17. }
  18. }
  19. queue<int> q;
  20. q.push(0);
  21. visited[0]=1;
  22. while(q.size()>0)
  23. {
  24. int node = q.front();
  25. q.pop();
  26. for(int i=0;i<adj[node].size();i++)
  27. {
  28. if(visited[adj[node][i]]==0)
  29. {
  30. visited[adj[node][i]] =1;
  31. q.push(adj[node][i]);
  32. }
  33. }
  34.  
  35. }
  36. for(int i=0;i<countNodes;i++)
  37. {
  38. if(visited[i]==0)
  39. return false;
  40. }
  41. return true;
  42. }
  43.  
  44. int maxWeight(int n,int threshold,vector<vector<int>> & edges)
  45. {
  46. int minW = INT_MAX;
  47. int maxW = INT_MIN;
  48. if(threshold==0)
  49. return -1;
  50. for(int i=0;i<edges.size();i++)
  51. {
  52. if(minW>edges[i][2])
  53. minW = edges[i][2];
  54.  
  55. if(maxW<edges[i][2])
  56. maxW = edges[i][2];
  57. }
  58. //cout<<"min max are "<<min<<max;
  59. int ans =-1;
  60. while(minW<=maxW)
  61. {
  62. int mid = (minW+maxW )/2;
  63. if(allNodesReachablefromZero(mid,edges,n))
  64. {
  65. ans = mid;
  66. maxW = mid-1;
  67. }
  68. else
  69. {
  70. minW = mid+1;
  71. }
  72. }
  73. return ans;
  74. }
  75. int main() {
  76. // your code goes here
  77. vector<vector<int>> test1 = {{1,0,1},{2,0,2},{3,0,1},{4,3,1},{2,1,1}};
  78. vector<vector<int>> test2 = {{0,1,1},{0,2,2},{0,3,1},{0,4,1},{1,2,1},{1,4,1}};
  79. cout<<maxWeight(5,2,test1);
  80. cout<<"\n";
  81. cout<<maxWeight(5,2,test2);
  82. return 0;
  83. }
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
1
-1