#POJ 2239回の選択コース(ハンガリー最大マッチングアルゴリズム/二部グラフ)

説明

よくコースの時間の間で衝突が通常ありますのは、大学のコースを選択することは容易ではないことが知られています。李明はすべての多くの研究が大好きな学生であり、各期間の初めに、彼は常に可能な限り多くのとしてのコースを選択したいです。もちろん、彼が選択したコースの間には、競合があってはなりません。

12クラスの毎日、そして7日毎週があります。そこのコースの何百もの大学であり、そしてコースを教えることは毎週1つのクラスを必要とします。コースを教えることだけで1つのクラスを必要とするものの、学生に多くの利便性を与えるために、コースは週に数回教えられます。例えば、コースは水曜日に火曜日と12番目のクラスで7番目のクラスの両方を教えすることができる、次の2つのクラス間に差がないことを想定する必要があり、学生はどこへ行くか、任意のクラスを選択することが可能となります。別の週で、学生でも彼の願いとして、別のクラスに行くことができます。大学で非常に多くのコースがあるので、コースを選択すると、李明のための簡単な仕事ではありません。彼の良き友人として、あなたは彼を助けることができますか?

入力

入力には、いくつかの例が含まれています。各場合について、最初の行は整数nを含有する(1 <= N <= 300)、李明の大学のコースの数。続くn行は、n個の異なるコースを表します。各行では、最初の数字は整数t(1 <= T <= 7 * 12)、学生がコースを研究するために行くことができる別の時間です。次に、整数p(1 <= p <= 7)およびQ(1 <= Q <= 12)、コースはのp番目の日にq番目のクラスで教えられるであろうことを意味するのT対来週間。

出力

各テストケースのために、出力李明が選択できるコースの最大数であるもの整数。

サンプル入力

5 
1 1 1 
2 1 1 2 2 
1 2 2 
2 3 2 3 3 
1 3 3

サンプル出力

4

 効果の対象:コースと授業時間数は、各レッスンのために与えられ、与えられたが、選択することができます(最初の週X Yクラス)、から選択するコースの最大数を見つけます。

考える:ハンガリーのアルゴリズムは、この質問の言葉を理解し、問題が何も別のテンプレートがない場合。添字もちろん、それは次のとおりです。私は、一般的に一次元でも1次元であるが、それでもこの質問は、一次元、二次元、1次元であるチャートに「接続」の問題をテンプレートとしてアルゴリズムこれを呼び出します数学のクラスと同等の、ああ、ああ語学クラスのみ一つの要素となるよう。二次元:曜日と2つの部分から成り最初のいくつかのクラス、。だから我々はちょうどテンプレートに少しアルゴリズムを変更、この質問に対する答えということです!具体的な達成するためにどのようにハンガリーのアルゴリズムは、オンラインの大物が明らかハよりマップを描き、私は説明しません。文:ケーブルは2の間に接続することができた場合はされていない場合、それは他のポイントに接続された場合、その後にも、スキップ、回線が接続される地点、および布を変更しようとすることができ、これは、再帰的なプロセスである(ワードよりも実際には、...)

ACコード:

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 3e2 + 5;

int p[maxn][15][15], net[15][15], n, t;
bool vis[15][15];
bool find_(int x) {
    for (int i = 1; i <= 7; i++) {
        for (int j = 1; j <= 12; j++) {
            if (!vis[i][j] && p[x][i][j]) {
                vis[i][j] = 1;
                if (!net[i][j] || find_(net[i][j])) {
                    net[i][j] = x;
                    return true;
                }
            }
        }
    }
    return false;
}

int main()
{
    while (cin >> n) {
        memset(p, 0, sizeof(p));
        memset(net, 0, sizeof(net));
        for (int i = 1; i <= n; i++) {
            cin >>t;
            while (t--) {
                int ai, bi;
                cin >> ai >> bi;
                p[i][ai][bi] = 1;
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            memset(vis, 0, sizeof(vis));
            if (find_(i)) ans++;
        }
        cout << ans << endl;
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_43851525/article/details/91373918