hdu 5594 ZYB's Prime 最大流
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 最大流相关推荐
- HDU 5594(ZYB's Prime-网络流)
题意:给出N个数,现在要求将它们分成K 组(K≥1)(K\geq 1),每组数的个数都≥3,将每组中的数排成一个环,要求相邻的两个数加起来是个质数.对于这N个数,能不能将它们分组? 解法:先不考虑1, ...
- hdu5594 ZYB's Prime
hdu5594 ZYB's Prime Problem Description After getting 600 scores in NOIP,ZYB(ZJ−267) creates a probl ...
- 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 ...
- BC#65 T5 ZYB's Prime
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5594 完全不会啊TAT.. 其实官方题解已经说的很清楚了.. #include <cstdio> ...
- hdu 5592 ZYB's Premutation (线段树+二分查找)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5592 Problem Description ZYB has a premutation P,but h ...
- hdu 1553 Going Home【最大流最小费用流】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 题意:给一个 n*m 的地图,上面有数量相同的人和房子,人每走一格需要花费一块前,问全部人走到房 ...
- POJ 2195 Going Home / HDU 1533(最小费用最大流模板)
题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...
- HDU - 3416 Marriage Match IV(最大流+最短路)
题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...
- HDU - 4289 Control(最小割-最大流)
题目链接:点击查看 题目大意:给出一张n个点m条边的无向图,一些恐怖分子要从点st到点ed去安装炸弹,为了阻止他们这样做,必须在某些点布置警察,只要恐怖分子路过警察所在的点就会被逮捕,在某个点布置警察 ...
最新文章
- HDU 1574 RP问题
- C++---拷贝构造函数和赋值构造函数
- 信息安全系统设计基础第十五周总结
- Linux C: 为什么C都必须有一个main函数
- SpringBoot-SpringCloud-版本对应关系
- request获得请求参数
- C#多线程开发-处理子线程中的异常
- Qt 二级菜单无法输入中文
- WCF的追踪分析工具——SvcPerf
- 使用BmFont制作unity可以使用的图集数字
- java 多线程 银行排队_3.采用多线程模拟银行排队叫号
- 数据库的备份与恢复技术
- Stack Frame JAVA运行时数据区域之栈帧
- spurious wakeup -- 多线程之虚假唤醒
- 8大排序算法总结-Python
- 【爱课程-精品通选系列课程】哲学智慧与人文思想
- 仿照登录界面实现网站的注册
- Linux攻关之基础模块十二 进程相关
- 计算机四级初级程序员考试试卷
- 阿里云ecs云服务器建立wordpress个人博客教程