二分图例题加模板

唐纳德是一个数学天才。有一天,他的数学老师决定为难一下他。他跟唐纳德说:「现在我们来玩一个游戏。这个游戏总共 n轮,每一轮我都会给你一个数(第 i 轮给出的数是 ai)。你每次要回答一个数,是我给出的这个数的质因数,并且你说出的数不能重复。」

因为数学老师是刻意为难,所以这个游戏很有可能不可能进行到最后。但是聪明的数学老师早就已经知道这个游戏最多能进行几轮了。现在他把问题抛给了你,想看看你知不知道。

注意,1 不是质数。

Input

输入具有如下形式:

na1 a2  an

第一行一个整数 n (1n3 000)。

第二行 n 个整数用空格隔开,a1,a2,,an (2ai106)。

Output

输出游戏最多能进行几轮。

Examples

Input
3
7 6 3
Output
3
Input
5
2 2 2 2 2
Output
1

#include<bits/stdc++.h>
using namespace std;
vector <int> vic[100010];
int biao[100010];  // 标记在搜索这次增广路经中哪个点被用过
int x[100010]; 
int j[100021]; //记录二分图右边连的哪一个左边
int dfs(int dang){
    for(int i=0;i<vic[dang].size();i++){
        int now=vic[dang][i];
        if(biao[now]==0){
            biao[now]=1;
            if(j[now]==0||dfs(j[now])==1){
                j[now]=dang;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int m;
    scanf("%d",&m);
    for(int i=0;i<m;i++){
        scanf("%d",&x[i]);
    }
    for(int i=0;i<x[i];i++){
        for(int j=1;j<=sqrt(x[i]);j++){
            if(x[i]%j==0){
                vic[i].push_back(j);
                vic[i].push_back(x[i]%j);
            }
        }
    }
    memset(j,0,sizeof(j));
    int ans=0;
    for(int i=0;i<m;i++){
        memset(biao,0,sizeof(biao));//每次搜索增光路经要重新标记
       ans+= dfs(i);
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/fzw1523/p/10271321.html
今日推荐