您的位置:首页 > 其它

2016年提高组模拟试题(20161105)高维宇宙

2016-11-05 14:54 274 查看




分析:

一开始把可以组成一组的所有点连起来,然后打一遍匹配即可。

代码:

type
node=record
x,y,next:longint;
end;

const
maxn=200;
maxv=7000;
var
g:array [1..maxv] of node;
ls,link,a:array [1..maxn] of longint;
cover:array [1..maxn] of boolean;
es:array [1..2001] of boolean;
n,e:longint;
procedure init;
var i,x,y,j,m:longint;
begin
readln(n);
m:=0;
for i:=2 to 2001 do
begin
es[i]:=true;
for j:=2 to trunc(sqrt(i)) do
if i mod j=0 then
begin es[i]:=false; break; end;
end;
for i:=1 to n do
begin
read(a[i]);
for j:=1 to i-1 do
begin
if es[a[i]+a[j]] then
begin
inc(m);
g[m].x:=i;
g[m].y:=j;
g[m].next:=ls[i];
ls[i]:=m;
inc(m);
g[m].x:=j;
g[m].y:=i;
g[m].next:=ls[j];
ls[j]:=m;
end;
end;
end;
end;

function find(p:longint):boolean;
var
t,q:longint;
begin
find:=true;
t:=ls[p];
while t>0 do
with g[t] do
begin
if cover[y]=false then
begin
cover[y]:=true;
q:=link[y];
link[y]:=p;
if (q=0) or find(q) then exit;
link[y]:=q;
end;
t:=next;
end;
find:=false;
end;

procedure main;
var i:longint;
begin
for i:=1 to n do
begin
fillchar(cover,sizeof(cover),0);
find(i);
end;
end;

procedure print;
var
i,s:longint;
begin
s:=0;
for i:=1 to n do
if link[i]<>0 then s:=s+1;
writeln(s div 2);
end;

begin
init;
main;
print;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: