高维宇宙 ssl 2552 最大匹配
2016-11-05 12:05
176 查看
题目大意
分析
把原数列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.
相关文章推荐
- 火力网加强版(difficult) SSL_1124 (最大匹配)
- 地鼠的困境SSL1333 最大匹配
- SSL 1338 最大匹配 人员分配
- 小行星 SSL_1341(最大匹配)
- 信与信封问题 SSL_1331(最大匹配)
- SSL1333 地鼠的困境(最大匹配)
- SSL1338 人员分配(最大匹配)
- 最大匹配 人员分配(SSL_1338)
- Machine Schedule SSL_1342(最大匹配)
- (ssl1904)USACO 4.2 The Perfect Stall 完美的牛栏(最大匹配)
- HDU 1528 Card Game Cheater(二分图最大匹配)
- Antenna Placement poj3020(二分图最大匹配/最小路径覆盖)
- 图的最大匹配——链接文...
- POJ1274(二分图最大匹配)
- Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)
- [Tjoi2016&Heoi2016]游戏 二分图最大匹配
- 匈牙利算法---解决最大匹配问题
- 二分图最大匹配 & 最大独立集
- poj3020二分图最大匹配
- 最大流和二分匹配