タイトル説明
ペアリングする必要のある靴下が多すぎるため、BaoBaoは靴下のペアリングプロセス全体を2つの段階に分けています。
最初の段階では、BaoBaoは靴下をペアでランダムに配布します。次に、第2段階で、BaoBaoは、すべての靴下がペアになるまで次の操作を繰り返します。BaoBaoは、靴下のペアのいくつかを選択し、それらを魔法の洗面台に入れ、魔法を使用します。彼が魔法を使うときに魔法の洗面台の靴下を完全にペアリングできる場合、魔法の洗面台は自動的にそれらをBaoBaoとペアリングします。ただし、それができない場合(つまり、盆地に独特の色の靴下が少なくとも1つある場合)、魔法の盆地は爆発し、BaoBaoはこれを起こさせてはなりません。
バオバオの魔法は限られています。最初の段階の後、彼はすべての靴下をうまくペアリングするために必要な魔法の洗面台の最小容量を知る必要があります。洗面器の容量は、BaoBaoが魔法の洗面台に一度に入れることができる靴下の最大ペア数です。
入力
入力には複数のケースが含まれます。入力の最初の行には、ケースの数である単一の正の整数T(1≤T≤10)が含まれています。
いずれの場合も、入力の最初の行には、靴下のペアの数である単一の整数n(1≤n≤105)が含まれています。
次のn行の場合、i番目(1≤i≤n)の行には2つの整数aiとbi(1≤ai、bi≤230)が含まれ、最初のペアの後のi番目のペアの2つの靴下の色を示します。ステージ。靴下ごとに、同じ色の靴下が1つだけあることが保証されています。
出力
それぞれの場合について、魔法の洗面台の最小容量である単一の整数を含む単一の行を印刷します。
例えば
、入力
1
5
1 2
2 3
1 3
4 5
4 5
出力
3
題名
色違いの靴下を用意してください。容器に入れてペアリングする必要があります。すべての靴下をうまく合わせることができたら、この容器の最小容量を尋ねてください。
例:サンプルでは、ソックスが5ペアあり、最初の3ペアを最初に配置してから、1 1/2 2/3 3のマッチングを完了し、最後の2ペアをすべて正常にペアリングできます。また、5ペアを直接配置することもできます。もちろん、コンテナでは、これは明らかに最適なソリューションではありません。
ACコード
#include <iostream>
#include <unordered_map>
#define ll long long
#define MAX 100010
using namespace std;
unordered_map <ll,ll> F,M;
ll a[MAX],b[MAX];
ll found(ll x)//并查集路径压缩,直接将父节点更新为祖宗结点,减少后续查找的时间
{
if(F[x]==x)return x;
else return F[x]=found(F[x]);
}
int main()
{
ios::sync_with_stdio(false);
ll t;
cin>>t;
while(t--)
{
F.clear();
M.clear();
ll n;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i]>>b[i];
F[a[i]]=a[i];
F[b[i]]=b[i];
}
for(int i=0; i<n; i++)
if(found(a[i])!=found(b[i]))
F[found(a[i])]=found(b[i]);
ll ma=0;
for(int i=0; i<n; i++)
{
M[found(a[i])]++;
M[found(b[i])]++;
ma=max(ma,M[found(a[i])]);
ma=max(ma,M[found(b[i])]);
}
cout<<ma/2<<endl;
}
return 0;
}