素数伴侣--最大二分匹配

来源:互联网 发布:淘宝店铺 出售 编辑:程序博客网 时间:2024/05/06 11:22
#include<bits/stdc++.h>using namespace std;#define N 100int edge[N][N],cx[N],cy[N];//edge记录两点的关系,如果两点相连,则edge【i】【j】为1int visited[N];//判断该店是否被访问过int nx,ny,res;const int M=60000+100;bool prim[M];void initprim(){    memset(prim,true,sizeof(prim));    prim[0]=prim[1]=false;    for(int i=2; i*i<=M; i++)        for(int j=i*i; j<M; j+=i)        {            if(prim[j])prim[j]=false;        }}int path(int u){    int v;    for(v=0; v<ny; v++)    {        if(edge[u][v]&&!visited[v])        {            visited[v]=1;            if(cy[v]==-1||path(cy[v]))////如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路            {                cx[u]=v;                cy[v]=u;                return 1;            }        }    }    return 0;}int main(){    int n;    initprim();    while(scanf("%d",&n)!=EOF)    {        int i,j,a[100]= {0},a1[100]= {0},a2[100]= {0};        nx=0,ny=0,res=0;        memset(cx,0xff,sizeof(cx));        memset(cy,0xff,sizeof(cy));//初始值为-1表示两个集合中都没有匹配的元素!        memset(edge,0,sizeof(edge));        for(i=0; i<n; i++)        {            scanf("%d",&a[i]);            if(a[i]%2==1)                a1[nx++]=a[i];            else                a2[ny++]=a[i];        }        for(i=0; i<nx; i++) //初始化edge数组,如果两个数之和为素数,则edge[i][j]置1        {            for(j=0; j<ny; j++)            {                if(prim[a1[i]+a2[j]])edge[i][j]=1;            }        }        for(i=0; i<nx; i++)        {            if(cx[i]==-1)            {                memset(visited,0,sizeof(visited));                res+=path(i);            }        }        printf("%d\n",res);    }}

原创粉丝点击