[POJ 1611 ---容疑者]互いに素なセット

[POJ 1611 ---容疑者]互いに素なセット

トピック出典:入力するようにクリックして、[POJ 1611 -サスペクツ]

説明

重症急性呼吸器症候群(SARS)、原因不明の非定型肺炎は、他者への送信を最小限に抑えるために半ば2003年3月に世界的な脅威として認識された、最善の戦略は、他の人から容疑者を分離することです。
拡散はない-あなたの酔い大学(NSYSU)では、多くの学生のグループがあります。頻繁にお互いに同じグループで相互の学生、そして学生は、いくつかのグループに参加することができます。SARSの可能性のある送信を防ぐために、NSYSUは、すべての学生グループのメンバーリストを収集し、その標準作業手順(SOP)に以下のルールを作ります。
グループのメンバーが容疑者になると、グループ内のすべてのメンバーは、容疑者です。
しかし、彼らは学生が容疑者として認識されている場合、それはすべての容疑者を特定することは容易ではないことがわかります。あなたの仕事は、すべての容疑者を発見するプログラムを書くことです。

入力

入力ファイルは、いくつかの例が含まれています。各テストケースは、nは、学生の数であり、mはグループの数であるライン内の2つの整数n及びmで始まります。あなたは0 <N <= 30000及び0 <= M <= 500すべての学生が0とn-1との間の一意の整数により番号付けされ、そして最初生徒0は、すべての場合において容疑者として認識されていることを仮定してもよいです。このラインは、グループのMメンバーリスト、グループごとに1つの行が続きます。各ラインは、グループ内のメンバーの数を表す単独で整数kから始まります。メンバーの数に続いて、このグループの学生を代表するk個の整数があります。行のすべての整数は、少なくとも1つのスペースで区切られます。
N = 0の場合であり、m = 0、入力の終了を示し、そして処理される必要はありません。

出力

各場合について、出力1つのラインの容疑者の数。

サンプル入力

100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0

サンプル出力

4
1
1

問題解決のためのアイデア

そして、コレクションの同じ要素を組み込むことにより、流域のタイトルを確認してください。どのように多くの要素あなたは0がある場所を決定するためにコレクションを反復処理することができます。

ACコード:

#include <iostream>
#include <algorithm>
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
const int MAXN = 3e4+5;
int pre[MAXN];

void init(int n)
{
    for(int i=0;i<=n;i++)
        pre[i]=i;
}

int _find(int x)
{
    if(x==pre[x]) return x;
    return pre[x]=_find(pre[x]);
}

void unite(int x,int y)
{
    x=_find(x);
    y=_find(y);
    if(x!=y) pre[x]=y;
}

int main()
{
    SIS;
    int n,m,t,x,y;
    while(cin >> n >> m, n)
    {
        init(n);
        while(m--)
        {
            cin >> t >> x;
            for(int i=1;i<t;i++)
                cin >> y, unite(x,y);
        }
        int ans=1;
        for(int i=1;i<n;i++)
            if(_find(0)==_find(i))
                ans++;
        cout << ans << endl;
    }
    return 0;
}
公開された412元の記事 ウォンの賞賛135 ・は 40000 +を見て

おすすめ

転載: blog.csdn.net/qq_41879343/article/details/104162766