ZYB's Prime

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.hdu.edu.cn/showproblem.php?pid=5594

Description

After getting 600 scores in NOIP,ZYB(ZJ−267) creates a problem:you are given N numbers,now you are asked to divide them into K groups(K≥1),the
number of each group must be no less than 3,and put all the numbers in a group into a ring,the sum of every two adjacent numbers must be a prime.ZYB want to ask
you whether the N numbers can be divided or not?

Input

In the first line there is the testcase T.

For each teatcase:

In the first line there is one number N.
In the next line there are N numbers Ai.

1≤T≤50,1≤N≤200,1≤Ai≤200,for 60% cases N≤20.

Output

For each testcase,print the YES or NO.

Sample Input

2
7
3 4 8 9 1 1 1
3
1 2 3

Sample Output

YES
NO

HINT

题意

题解:

代码:

#include<iostream>
#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;namespace NetFlow
{const int MAXN=100000,MAXM=100000,inf=1e9;struct Edge{int v,c,f,nx;Edge() {}Edge(int v,int c,int f,int nx):v(v),c(c),f(f),nx(nx) {}} E[MAXM];int G[MAXN],cur[MAXN],pre[MAXN],dis[MAXN],gap[MAXN],N,sz;void init(int _n){N=_n,sz=0; memset(G,-1,sizeof(G[0])*N);}void link(int u,int v,int c){E[sz]=Edge(v,c,0,G[u]); G[u]=sz++;E[sz]=Edge(u,0,0,G[v]); G[v]=sz++;}int ISAP(int S,int T){//S -> Tint maxflow=0,aug=inf,flag=false,u,v;for (int i=0;i<N;++i)cur[i]=G[i],gap[i]=dis[i]=0;for (gap[S]=N,u=pre[S]=S;dis[S]<N;flag=false){for (int &it=cur[u];~it;it=E[it].nx){if (E[it].c>E[it].f&&dis[u]==dis[v=E[it].v]+1){if (aug>E[it].c-E[it].f) aug=E[it].c-E[it].f;pre[v]=u,u=v; flag=true;if (u==T){for (maxflow+=aug;u!=S;){E[cur[u=pre[u]]].f+=aug;E[cur[u]^1].f-=aug;}aug=inf;}break;}}if (flag) continue;int mx=N;for (int it=G[u];~it;it=E[it].nx){if (E[it].c>E[it].f&&dis[E[it].v]<mx){mx=dis[E[it].v]; cur[u]=it;}}if ((--gap[dis[u]])==0) break;++gap[dis[u]=mx+1]; u=pre[u];}return maxflow;}bool bfs(int S,int T){static int Q[MAXN]; memset(dis,-1,sizeof(dis[0])*N);dis[S]=0; Q[0]=S;for (int h=0,t=1,u,v,it;h<t;++h){for (u=Q[h],it=G[u];~it;it=E[it].nx){if (dis[v=E[it].v]==-1&&E[it].c>E[it].f){dis[v]=dis[u]+1; Q[t++]=v;}}}return dis[T]!=-1;}int dfs(int u,int T,int low){if (u==T) return low;int ret=0,tmp,v;for (int &it=cur[u];~it&&ret<low;it=E[it].nx){if (dis[v=E[it].v]==dis[u]+1&&E[it].c>E[it].f){if (tmp=dfs(v,T,min(low-ret,E[it].c-E[it].f))){ret+=tmp; E[it].f+=tmp; E[it^1].f-=tmp;}}}if (!ret) dis[u]=-1; return ret;}int dinic(int S,int T){int maxflow=0,tmp;while (bfs(S,T)){memcpy(cur,G,sizeof(G[0])*N);while (tmp=dfs(S,T,inf)) maxflow+=tmp;}return maxflow;}
}
using namespace NetFlow;int One;
vector<int> Even,Odd;
const int MAXN_ = 10000;
bool _flag[MAXN_];
int _primes[MAXN_], _pi;
void GetPrime_1()
{int i, j;_pi = 0;memset(_flag, false, sizeof(_flag));for (i = 2; i < MAXN_; i++)if (!_flag[i]){_primes[i] = 1;//素数标识为1for (j = i; j < MAXN_; j += i)_flag[j] = true;}
}
void Clear()
{Even.clear();Odd.clear();init(100000);One=0;
}
bool work()
{int n;scanf("%d",&n);int flag = 0;for(int i=1;i<=n;i++){int x;scanf("%d",&x);if(x==1)One++;else if(x%2==1)Odd.push_back(x);else Even.push_back(x);}if(Odd.size()>Even.size())return 0;if(Odd.size()+One<Even.size())return 0;int In = 0;while(Odd.size()<Even.size()){flag = 1;Odd.push_back(1);One--;In++;}if(flag==0&&(One==1||One==2))return 0;int tmp = 0;for(int i=0;i<Odd.size();i++)link(0,1+i,2);for(int i=0;i<Even.size();i++)link(n+2+i,600,2);for(int i=0;i<Odd.size();i++){for(int j=0;j<Even.size();j++){if(_primes[Odd[i]+Even[j]]){if(Odd[i]==1&&One>0&&In>0)link(1+i,n+2+j,2);elselink(1+i,n+2+j,1);}}}if(Even.size()*2==dinic(0,600))return 1;return 0;
}
int main()
{GetPrime_1();int t;scanf("%d",&t);for(int cas=1;cas<=t;cas++){Clear();printf("%s\n",work()?"YES":"NO");}
}

hdu 5594 ZYB's Prime 最大流相关推荐

  1. HDU 5594(ZYB's Prime-网络流)

    题意:给出N个数,现在要求将它们分成K 组(K≥1)(K\geq 1),每组数的个数都≥3,将每组中的数排成一个环,要求相邻的两个数加起来是个质数.对于这N个数,能不能将它们分组? 解法:先不考虑1, ...

  2. hdu5594 ZYB's Prime

    hdu5594 ZYB's Prime Problem Description After getting 600 scores in NOIP,ZYB(ZJ−267) creates a probl ...

  3. hdu 5591 ZYB's Game 博弈论

    ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ...

  4. BC#65 T5 ZYB's Prime

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5594 完全不会啊TAT.. 其实官方题解已经说的很清楚了.. #include <cstdio> ...

  5. hdu 5592 ZYB's Premutation (线段树+二分查找)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5592 Problem Description ZYB has a premutation P,but h ...

  6. hdu 1553 Going Home【最大流最小费用流】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 题意:给一个 n*m 的地图,上面有数量相同的人和房子,人每走一格需要花费一块前,问全部人走到房 ...

  7. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  8. HDU - 3416 Marriage Match IV(最大流+最短路)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...

  9. HDU - 4289 Control(最小割-最大流)

    题目链接:点击查看 题目大意:给出一张n个点m条边的无向图,一些恐怖分子要从点st到点ed去安装炸弹,为了阻止他们这样做,必须在某些点布置警察,只要恐怖分子路过警察所在的点就会被逮捕,在某个点布置警察 ...

最新文章

  1. HDU 1574 RP问题
  2. C++---拷贝构造函数和赋值构造函数
  3. 信息安全系统设计基础第十五周总结
  4. Linux C: 为什么C都必须有一个main函数
  5. SpringBoot-SpringCloud-版本对应关系
  6. request获得请求参数
  7. C#多线程开发-处理子线程中的异常
  8. Qt 二级菜单无法输入中文
  9. WCF的追踪分析工具——SvcPerf
  10. 使用BmFont制作unity可以使用的图集数字
  11. java 多线程 银行排队_3.采用多线程模拟银行排队叫号
  12. 数据库的备份与恢复技术
  13. Stack Frame JAVA运行时数据区域之栈帧
  14. spurious wakeup -- 多线程之虚假唤醒
  15. 8大排序算法总结-Python
  16. 【爱课程-精品通选系列课程】哲学智慧与人文思想
  17. 仿照登录界面实现网站的注册
  18. Linux攻关之基础模块十二 进程相关
  19. 计算机四级初级程序员考试试卷
  20. 阿里云ecs云服务器建立wordpress个人博客教程

热门文章

  1. 图形学入门学习-GAMES101课程(2)
  2. ZOJ 3797 Sister's Noise 组合+DP
  3. GO Strings-and-runes
  4. linux vmware 共享文件夹共享,解决vmware上使用linux虚拟,无法共享文件的问题
  5. 计算机房的网络化管理,学校计算机房的设计与管理
  6. LeetCode 834
  7. 高通TrueWireless Mirroring无缝的用户体验镜像技术
  8. CDC-NCM和CDC-ECM性能差别
  9. 《Android源码设计模式解析与实战》读书笔记(十七)
  10. 互联网经济的背后-梅特卡夫效应与双边市场效应