高维宇宙 ssl 2552 最大匹配

来源:互联网 发布:表白网站源码2017 编辑:程序博客网 时间:2024/05/16 00:54

题目大意

这里写图片描述

分析

把原数列a复制到数列b中
然后把两个相加是质数的连在一起,做最大匹配
最后把答案除以2,解决

代码

type  arr=record    x,y,w:longint;    next:longint;end;var  a:array[1..10000] of arr;  b:array[1..10000] of longint;  v:array[1..30000] of boolean;  f:array[1..10000000] of longint;  st,ls:array[1..30000] of longint;  i,j,k:longint;  n,m,nm:longint;function find(r:longint):boolean;var  i,j,k:longint;begin  find:=true;  i:=ls[r];  while i<>0 do    begin      with a[i] do        if not v[y]          then            begin              k:=st[y]; st[y]:=r; v[y]:=true;              if (k=0) or find(k) then exit;              st[y]:=k;            end;      i:=a[i].next;    end;  find:=false;end;procedure main;var  i,j,k:longint;  z:boolean;begin  for i:=1 to n do    begin      fillchar(v,sizeof(v),0);      z:=find(i);    end;end;begin  readln(n);  nm:=0;  fillchar(a,sizeof(a),false);  for i:=2 to trunc(sqrt(1000000)) do    if f[i]=0      then for j:=2 to 1000000 div i do        f[i*j]:=1;  for i:=1 to n do    read(b[i]);  for i:=1 to n do    for j:=1 to n do      if f[b[i]+b[j]]=0        then begin          nm:=nm+1;          with a[nm] do            begin              x:=i;              y:=j+n;              next:=ls[x];              ls[x]:=nm;            end;        end;  main;  j:=0;  for i:=n+1 to n+n do    if st[i]<>0 then j:=j+1;  write(j div 2);end.
0 0