Problem 1163 : Cards

keyword

2部グラフ マッチング C++

概要

数列a_iとb_iが与えられる。a_iとb_jは互いに素でなければペアとして選ぶことができる。最大でいくつペアをつくることができるか求める問題。
2部グラフの例題のような問題で動作確認にありがたい問題。

int main(){
    int m, n, i, j;
    int blues[502], reds[502];

    while(scanf("%d%d",&m,&n)){
        if(!(n||m))break;
        REP(i,m)scanf("%d",blues+i);
        REP(i,n)scanf("%d",reds+i);
        vector< vector<int> > bigraph(m);
        REP(i,m)REP(j,n)if(__gcd(blues[i], reds[j]) > 1)
            bigraph[i].PB(j);
        printf("%d\n", BipartiteMatchingByList(bigraph));
    }

    return 0;
}