#include <bits/stdc++.h>
using namespace std;
//toast418
#define ffor(i,o,f) for(int i = o; i < f; i++)
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(), (a).end()
#define F first
#define S second
#define PI 3.14159265358979323846264338327950
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef pair < int , int > pii;
typedef vector < int > vi;
typedef vector < pii > vii;
typedef vector < vi > gi;
typedef vector < ll > vll;
typedef map < int , int > mii;
int t, n, m, u, v, groups;
const int tam = 1005 ;
vi parent;
vi componentSize;
vii edges;
vii addedEdges;
int find( int nd) {
if ( parent[ nd] == nd) {
return nd;
}
return parent[ nd] = find( parent[ nd] ) ;
}
void unite( int nd1, int nd2) {
nd1 = find( nd1) ;
nd2 = find( nd2) ;
if ( nd1 == nd2) {
return ;
}
if ( componentSize[ nd1] < componentSize[ nd2] ) {
swap( nd1, nd2) ;
}
parent[ nd2] = nd1;
componentSize[ nd1] + = componentSize[ nd2] ;
}
void query( int nd1, int nd2) {
if ( find( nd1) == find( nd2) ) {
cout << "SI, la componente tiene "
<< componentSize[ find( nd1) ] << " nodos" << endl;
}
else {
cout << "NO" << endl;
}
}
void connectGraph( ) {
vi representatives;
ffor( i, 0 , 10 ) {
if ( find( i) == i) {
representatives.pb ( i) ;
}
}
ffor( i, 1 , sz( representatives) ) {
int nd1 = representatives[ i - 1 ] ;
int nd2 = representatives[ i] ;
if ( find( nd1) ! = find( nd2) ) {
addedEdges.pb ( mp( nd1, nd2) ) ;
unite( nd1, nd2) ;
}
}
}
int main( )
{
parent.assign ( tam, 0 ) ;
componentSize.assign ( tam, 1 ) ;
ffor( i, 0 , tam) {
parent[ i] = i;
}
edges.pb ( mp( 0 , 3 ) ) ;
edges.pb ( mp( 0 , 5 ) ) ;
edges.pb ( mp( 3 , 6 ) ) ;
edges.pb ( mp( 5 , 6 ) ) ;
edges.pb ( mp( 1 , 4 ) ) ;
edges.pb ( mp( 4 , 8 ) ) ;
edges.pb ( mp( 2 , 7 ) ) ;
ffor( i, 0 , sz( edges) ) {
unite( edges[ i] .F , edges[ i] .S ) ;
}
query( 5 , 3 ) ;
query( 1 , 8 ) ;
query( 6 , 7 ) ;
query( 9 , 9 ) ;
connectGraph( ) ;
cout << "Se necesitan " << sz( addedEdges)
<< " aristas para conectar todo el grafo:" << endl;
ffor( i, 0 , sz( addedEdges) ) {
cout << addedEdges[ i] .F << "-" << addedEdges[ i] .S << endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovL3RvYXN0NDE4CiNkZWZpbmUgZmZvcihpLG8sZikJCSAgIGZvcihpbnQgaSA9IG87IGkgPCBmOyBpKyspCiNkZWZpbmUgcGIgCQkJCSAgIHB1c2hfYmFjawojZGVmaW5lIG1wICAgICAgICAgICAgICAgICBtYWtlX3BhaXIKI2RlZmluZSBhbGwoYSkgICAgICAgICAgICAgKGEpLmJlZ2luKCksIChhKS5lbmQoKQojZGVmaW5lIEYgICAgICAgICAgICAgICAgICBmaXJzdAojZGVmaW5lIFMgICAgICAgICAgICAgICAgICBzZWNvbmQKI2RlZmluZSBQSSAJCQkJICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MAojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKI2RlZmluZSBlbmRsIAkJCSAgICdcbicKI2RlZmluZSBzeih4KSAgICAgICAgICAgICAgKChpbnQpKHgpLnNpemUoKSkKdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgbGw7CnR5cGVkZWYgcGFpciA8IGludCwgaW50ID4gIHBpaTsKdHlwZWRlZiB2ZWN0b3IgPCBpbnQgPiAgICAgdmk7CnR5cGVkZWYgdmVjdG9yIDwgcGlpID4gICAgIHZpaTsKdHlwZWRlZiB2ZWN0b3IgPCB2aSA+IAkgICBnaTsKdHlwZWRlZiB2ZWN0b3IgPCBsbCA+ICAgICAgdmxsOwp0eXBlZGVmIG1hcCA8IGludCwgaW50ID4gICBtaWk7CgppbnQgdCwgbiwgbSwgdSwgdiwgZ3JvdXBzOwpjb25zdCBpbnQgdGFtID0gMTAwNTsKdmkgcGFyZW50Owp2aSBjb21wb25lbnRTaXplOwp2aWkgZWRnZXM7CnZpaSBhZGRlZEVkZ2VzOwoKaW50IGZpbmQoaW50IG5kKXsKICAgIGlmKHBhcmVudFtuZF0gPT0gbmQpewogICAgICAgIHJldHVybiBuZDsKICAgIH0KICAgIHJldHVybiBwYXJlbnRbbmRdID0gZmluZChwYXJlbnRbbmRdKTsKfQoKdm9pZCB1bml0ZShpbnQgbmQxLCBpbnQgbmQyKXsKICAgIG5kMSA9IGZpbmQobmQxKTsKICAgIG5kMiA9IGZpbmQobmQyKTsKICAgIGlmKG5kMSA9PSBuZDIpewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKGNvbXBvbmVudFNpemVbbmQxXSA8IGNvbXBvbmVudFNpemVbbmQyXSl7CiAgICAgICAgc3dhcChuZDEsIG5kMik7CiAgICB9CiAgICBwYXJlbnRbbmQyXSA9IG5kMTsKICAgIGNvbXBvbmVudFNpemVbbmQxXSArPSBjb21wb25lbnRTaXplW25kMl07Cn0KCnZvaWQgcXVlcnkoaW50IG5kMSwgaW50IG5kMil7CiAgICBpZihmaW5kKG5kMSkgPT0gZmluZChuZDIpKXsKICAgICAgICBjb3V0IDw8ICJTSSwgbGEgY29tcG9uZW50ZSB0aWVuZSAiCiAgICAgICAgICAgICA8PCBjb21wb25lbnRTaXplW2ZpbmQobmQxKV0gPDwgIiBub2RvcyIgPDwgZW5kbDsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgY291dCA8PCAiTk8iIDw8IGVuZGw7CiAgICB9Cn0KCnZvaWQgY29ubmVjdEdyYXBoKCl7CiAgICB2aSByZXByZXNlbnRhdGl2ZXM7CiAgICBmZm9yKGksIDAsIDEwKXsKICAgICAgICBpZihmaW5kKGkpID09IGkpewogICAgICAgICAgICByZXByZXNlbnRhdGl2ZXMucGIoaSk7CiAgICAgICAgfQogICAgfQogICAgZmZvcihpLCAxLCBzeihyZXByZXNlbnRhdGl2ZXMpKXsKICAgICAgICBpbnQgbmQxID0gcmVwcmVzZW50YXRpdmVzW2kgLSAxXTsKICAgICAgICBpbnQgbmQyID0gcmVwcmVzZW50YXRpdmVzW2ldOwogICAgICAgIGlmKGZpbmQobmQxKSAhPSBmaW5kKG5kMikpewogICAgICAgICAgICBhZGRlZEVkZ2VzLnBiKG1wKG5kMSwgbmQyKSk7CiAgICAgICAgICAgIHVuaXRlKG5kMSwgbmQyKTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgcGFyZW50LmFzc2lnbih0YW0sIDApOwogICAgY29tcG9uZW50U2l6ZS5hc3NpZ24odGFtLCAxKTsKICAgIGZmb3IoaSwgMCwgdGFtKXsKICAgICAgICBwYXJlbnRbaV0gPSBpOwogICAgfQoKICAgIGVkZ2VzLnBiKG1wKDAsIDMpKTsKICAgIGVkZ2VzLnBiKG1wKDAsIDUpKTsKICAgIGVkZ2VzLnBiKG1wKDMsIDYpKTsKICAgIGVkZ2VzLnBiKG1wKDUsIDYpKTsKICAgIGVkZ2VzLnBiKG1wKDEsIDQpKTsKICAgIGVkZ2VzLnBiKG1wKDQsIDgpKTsKICAgIGVkZ2VzLnBiKG1wKDIsIDcpKTsKCiAgICBmZm9yKGksIDAsIHN6KGVkZ2VzKSl7CiAgICAgICAgdW5pdGUoZWRnZXNbaV0uRiwgZWRnZXNbaV0uUyk7CiAgICB9CgogICAgcXVlcnkoNSwgMyk7CiAgICBxdWVyeSgxLCA4KTsKICAgIHF1ZXJ5KDYsIDcpOwogICAgcXVlcnkoOSwgOSk7CgogICAgY29ubmVjdEdyYXBoKCk7CgogICAgY291dCA8PCAiU2UgbmVjZXNpdGFuICIgPDwgc3ooYWRkZWRFZGdlcykKICAgICAgICAgPDwgIiBhcmlzdGFzIHBhcmEgY29uZWN0YXIgdG9kbyBlbCBncmFmbzoiIDw8IGVuZGw7CiAgICBmZm9yKGksIDAsIHN6KGFkZGVkRWRnZXMpKXsKICAgICAgICBjb3V0IDw8IGFkZGVkRWRnZXNbaV0uRiA8PCAiLSIgPDwgYWRkZWRFZGdlc1tpXS5TIDw8IGVuZGw7CiAgICB9Cn0K