Analysis
二分图匹配,打错匈牙利我也是醉了
Code
#include <stdio.h>
#include <cstring>
#define N 211
#define M N*N+1
using namespace std;
struct edge{int x,y,next;}e[M];
int link[N],odd[N],eve[N],ls[M],maxE=0;
bool vis[N];
void add(int x,int y){e[++maxE]=(edge){x,y,ls[x]};ls[x]=maxE;}
bool prime(int x)
{
for (int i=2;i*i<=x;i++)
if (x%i==0)
return 0;
return 1;
}
int find(int x)
{
for (int i=ls[x];i;i=e[i].next)
for (int i=ls[x];i;i=e[i].next)
if (!vis[e[i].y])
{
vis[e[i].y]=true;
if (find(link[e[i].y])||!link[e[i].y])
{
link[e[i].y]=x;
return 1;
}
}
return 0;
}
int main()
{
// freopen("prime.in","r",stdin);
// freopen("prime.out","w",stdout);
int n,m,ans=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&odd[i]);
for (int j=1;j<i;j++)
if (prime(odd[i]+odd[j]))
add(i,j);
}
for (int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
ans+=find(i);
}
printf("%d\n",(ans));
return 0;
}