#include #include #include #include using namespace std; typedef pair ii; // Slow solution using BFS instead of UFDS. Quadratic time. bool connected(vector> g , int first, int second) { vector visited(g.size(),false); queue q; q.push(first); while(!q.empty()) { int t=q.front(); q.pop(); visited[t]=true; if(t==second) return true; for(int v:g[t]) if(!visited[v]) q.push(v); } return false; } int main() { int m,n; cin>>m>>n; vector > probabilities(m); priority_queue > q; for(int i=0; i(n); for (int j=0; j> probabilities[i][j]; } for(int i=0; i> len; for(int k=0; k> col; q.push(make_pair(probabilities[i][col],ii(-i,-m-col))); } } vector sol; vector> g(n+m); while(!q.empty()) { ii edge=q.top().second; q.pop(); edge.first=-edge.first; edge.second=-edge.second; if(!connected(g, edge.first, edge.second)) { g[edge.first].push_back(edge.second); g[edge.second].push_back(edge.first); sol.push_back(ii(edge.first, edge.second-m)); } } sort(sol.begin(), sol.end()); for(int i=0; i