Hackerearth Disjoint Set Union
/**
* @Author: Pranta Sarker
*
**/
#include<bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(0)
#define bfast cin.tie(0)
#define outs(x) cout << x << " "
#define outn(x) cout << x << "\n"
#define sf scanf
#define pf printf
#define pfn(x , k) printf(k , x)
#define nl puts("")
#define psb push_back
#define mset(c,v) memset(c , v , sizeof c)
#define loop0(n) for(int i=0; i<n; i++)
#define loop1(n) for(int i=1; i<=n; i++)
#define mpair(x , y) make_pair(x , y)
#define all(x) x.begin(), x.end()
#define pi acos(-1.0)
#define psb push_back
#define clr clear()
typedef unsigned long long ull;
typedef long long LL;
typedef vector<int>vii;
typedef vector<LL>vll;
typedef vector<string>vs;
typedef map<int, int>mpii;
typedef map<string, int>mpsi;
typedef map<char, int>mpci;
typedef map<LL, LL>mpll;
const int mod = 1000007;
const int high = 1002;
int par[high];
void init(int N)
{
for(int i=1; i<=N+5; i++)
{
par[i] = i;
}
}
int findd(int n)
{
if(n == par[n]) return n;
else return par[n] = findd(par[n]);
}
void unionn(int a , int b, int N)
{
int u = findd(a);
int v = findd(b);
if(u == v) return;
else
{
//cout << "u = " << u << " v = " << v << "\n";
//if(u > v) par[u] = v;
//else par[v] = u;
for(int i=1; i<=N; i++)
{
if(par[i] == u)
{
par[i] = v;
}
}
}
}
int main()
{
fast;
mpii mp;
vii v;
int N , M , X , Y;
cin >> N >> M;
init(N);
while(M--)
{
cin >> X >> Y;
unionn(X , Y, N);
mp.clear();
v.clear();
for(int i=1; i<=N; i++)
{
//cout << par[i] << "; ";
mp[par[i]]++;
}
mpii::iterator itr;
for(itr=mp.begin(); itr!=mp.end(); ++itr)
{
v.push_back(itr->second);
}
sort(all(v));
int len = v.size();
for(int i=0; i<len; i++)
{
cout << v[i] << " ";
}
cout << "\n";
}
return 0;
}
* @Author: Pranta Sarker
*
**/
#include<bits/stdc++.h>
using namespace std;
#define fast ios_base::sync_with_stdio(0)
#define bfast cin.tie(0)
#define outs(x) cout << x << " "
#define outn(x) cout << x << "\n"
#define sf scanf
#define pf printf
#define pfn(x , k) printf(k , x)
#define nl puts("")
#define psb push_back
#define mset(c,v) memset(c , v , sizeof c)
#define loop0(n) for(int i=0; i<n; i++)
#define loop1(n) for(int i=1; i<=n; i++)
#define mpair(x , y) make_pair(x , y)
#define all(x) x.begin(), x.end()
#define pi acos(-1.0)
#define psb push_back
#define clr clear()
typedef unsigned long long ull;
typedef long long LL;
typedef vector<int>vii;
typedef vector<LL>vll;
typedef vector<string>vs;
typedef map<int, int>mpii;
typedef map<string, int>mpsi;
typedef map<char, int>mpci;
typedef map<LL, LL>mpll;
const int mod = 1000007;
const int high = 1002;
int par[high];
void init(int N)
{
for(int i=1; i<=N+5; i++)
{
par[i] = i;
}
}
int findd(int n)
{
if(n == par[n]) return n;
else return par[n] = findd(par[n]);
}
void unionn(int a , int b, int N)
{
int u = findd(a);
int v = findd(b);
if(u == v) return;
else
{
//cout << "u = " << u << " v = " << v << "\n";
//if(u > v) par[u] = v;
//else par[v] = u;
for(int i=1; i<=N; i++)
{
if(par[i] == u)
{
par[i] = v;
}
}
}
}
int main()
{
fast;
mpii mp;
vii v;
int N , M , X , Y;
cin >> N >> M;
init(N);
while(M--)
{
cin >> X >> Y;
unionn(X , Y, N);
mp.clear();
v.clear();
for(int i=1; i<=N; i++)
{
//cout << par[i] << "; ";
mp[par[i]]++;
}
mpii::iterator itr;
for(itr=mp.begin(); itr!=mp.end(); ++itr)
{
v.push_back(itr->second);
}
sort(all(v));
int len = v.size();
for(int i=0; i<len; i++)
{
cout << v[i] << " ";
}
cout << "\n";
}
return 0;
}
Comments
Post a Comment