互いに素な各セットメンバーの要素数を数えるのに少し問題があります。たとえば、誰かが次のように入力した場合:
注:最初の数値=ソース頂点、2番目の数値=宛先頂点、3番目の数値=長さ
0 2 1
4 8 7
5 8 6
1 2 5
2 3 17
セットのカウントとして2があります
4 8 7
5 8 6
両方が2つと3つの(それぞれの)要素によって接続されているため、セットのカウントとして3。
0 2 1
1 2 5
2 3 17
互いに素な各セットの要素数のカウントを整数配列に格納して、互いに素なセットのカウントにアクセスできるようにすることを考えました。以下は、要素を見つけてそれらを同じセットに結合するための私の実装です。また、すべてのセットでルートを見つける機能もあります。
int node::findSet(int v, int *parent)
{
if(parent[v] < 0)
return v;
else
{
return parent[v] = findSet(parent[v], parent);
}
}
void node::joinSets(int c, int p1, int p2, int *parents)
{
join(findSet(p1,parents),findSet(p2,parents),parents);
}
void node::join(int p1, int p2, int *parents)
{
if(parents[p2] < parents[p1])
parents[p1] = p2;
else
{
if(parents[p1] == parents[p2])
parents[p1]--;
parents[p2] = p1;
}
}
カウンターをどこで/いつインクリメントして維持するかがわかりません。どんな助けでもいただければ幸いです。ありがとう!