素数伴侣--最大二分匹配
2017-05-20 17:21
225 查看
#include<bits/stdc++.h> using namespace std; #define N 100 int edge ,cx ,cy ;//edge记录两点的关系,如果两点相连,则edge【i】【j】为1 int visited ;//判断该店是否被访问过 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); } }
相关文章推荐
- 素数伴侣问题—>二部图最大匹配问题
- 牛客网 素数伴侣(二分图最大匹配,匈牙利算法)
- 二分匹配最大独立集——hdu1068
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- 网络最大流与二分匹配之间的关系
- HDU1281(最大二分匹配+枚举)
- hdu5285黑白染色二分最大匹配
- poj 2226 最大流二分匹配
- hdu1151 poj1422 最小路径覆盖.最大二分匹配
- poj3020 二分图 最大二分匹配
- 最大流和二分匹配
- TZC Asteroids 【二分最大匹配做】
- HDU 1068 Girls and Boys【二分匹配之最大独立集】
- poj 1274 基础二分最大匹配
- POJ 2226 Muddy Fields(二分匹配【最大流】)
- 最大权二分匹配
- POJ3692——Kindergarten(最大二分匹配)
- HDU 1068 Girls and Boys 二分图最大独立集(最大二分匹配)
- POJ 3041 (二分匹配->网络最大流)
- 【二分】【字符串哈希】【二分图最大匹配】【最大流】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem I. Minimum Prefix