ZOJ 3988 Prime Set(二分图)

来源:互联网 发布:五毛特效是什么软件 编辑:程序博客网 时间:2024/05/21 17:06

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3988


这个题,要是在赛场上估计会出的快一点?邻接矩阵被卡,一的情况加很多特判?很让人绝望啊。思路就是奇偶分开讨论,然后发现只有1和1能够连边,先不把1之间连边,然后跑匈牙利,然后在判断有多少个1没有被匹配,然后将它两两匹配,然后判断能不能用满k,如果不能就把剩下的一个一个加进去。就是将1的情况好好讨论一下。


代码:

#include<bits/stdc++.h>using namespace std;const int MAXN=3005;const int M=2e6+10;int n,k;int prime[M],a[MAXN];//保存素数 bool vis[M];//初始化 int cnt=0;vector<int> uN,vN;//u,v的数目,使用前面必须赋值 int linker[MAXN];bool used[MAXN],book[MAXN];void Prime(){memset(vis,0,sizeof(vis));for(int i=2;i<M;i++){if(!vis[i])prime[cnt++]=i;for(int j=0;j<cnt&&i*prime[j]<M;j++){vis[i*prime[j]]=1;if(i%prime[j]==0)//关键 break;}}}const int MAXM=1e7;//边数的最大值 struct Edge{int to,next;}edge[MAXM];int head[MAXN],tot;void init(){tot=0;memset(head,-1,sizeof(head));}void addedge(int u,int v){edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;}bool dfs(int u){for(int i=head[u];i!=-1;i=edge[i].next) {int v=edge[i].to;if(!used[v]){used[v]=true;if(linker[v]==-1||dfs(linker[v])){linker[v]=u;return true;}}}return false;}int hungary(){int res=0;memset(linker,-1,sizeof(linker));for(int u=0;u<uN.size();u++){memset(used,false,sizeof(used));if(dfs(uN[u]))res++;}return res;}void build(){init();uN.clear();vN.clear();for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(!vis[a[i]+a[j]]&&(!(a[i]==1&&a[j]==1))){addedge(i,j);addedge(j,i);}}}for(int i=1;i<=n;i++){if(a[i]%2==1){uN.push_back(i);}else{vN.push_back(i);}}}void solve(){int ans=0,Count=0,o=0,sz=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}build();ans=hungary();memset(book,false,sizeof(book));for(int i=1;i<=n;i++){if(linker[i]!=-1){book[i]=book[linker[i]]=true;}}for(int i=1;i<=n;i++){if(a[i]==1&&!book[i]){o++;}}ans+=o/2;sz=(o%2)?o-1:o;for(int i=1;i<=n&&sz;i++){if(a[i]==1&&(!book[i])){book[i]=true;sz--;}}if(ans>=k){printf("%d\n",2*k);return ;}k-=ans;ans*=2;if(o%2==1&&o>1){ans++;k--;for(int i=1;i<=n;i++){if(a[i]==1&&(!book[i])){book[i]=true;}}}for(int i=1;i<=n&&k;i++){if(book[i])continue;if(head[i]!=-1){ans++;k--;}}printf("%d\n",ans);}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);Prime();int T;scanf("%d",&T);while(T--){solve();}return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买家申请淘宝介入后同意退款怎么办 淘宝卖家手机版购买装修模块怎么办 天猫店铺和淘宝店铺想要装修怎么办 支付宝转账银行卡卡号错误怎么办 淘宝图片空间照片全部删除了怎么办 我把淘宝图片空间照片删除了怎么办 淘宝发布宝贝怎么没知道品牌怎么办 淘宝提前确认收货了怎么办已经发货 苹果支付安全提示问题忘记了怎么办 没有在规定日期交首付款怎么办 淘宝申请退款又不想退了怎么办 淘宝申请退款后又不想退了怎么办 申请退款后如果不想退了怎么办 世纪明德申请退款但不想退了怎么办 天猫申请换货商家不换怎么办 乐视手机刷机不想清除数据怎么办 捡的苹果手机刷机了要id怎么办 苹果6plus玩王者荣耀卡怎么办 华为荣耀3c的手机内存不足怎么办 红米4x玩王者荣耀卡怎么办 华为手机荣耀10一直重启怎么办 荣耀9青春版老自动重启怎么办 手机开不开机停在华为界面怎么办 华为荣耀9老是反复的重启怎么办 华为荣耀4x老是反复的重启怎么办 手机更新系统后开不了机怎么办 荣耀畅玩7x没有4g网络怎么办 华为4x数字解锁不对中怎么办 华为手机需要解锁后才能刷机怎么办 畅玩6x锁屏壁纸黑了怎么办 指纹密码解锁的手机解不开了怎么办 客户说物流太慢了要退货怎么办 天猫买的手机商家不给发票怎么办 天猫超市下单付款后缺货怎么办 淘宝卖家填写假的单号不发货怎么办 天猫商家72小时未发货怎么办 天猫精灵方糖不按顺序播放怎么办 在天猫购物已付款不发货怎么办 淘宝退货商家收到货不退款怎么办 被有实名认证的闲鱼卖家骗了怎么办 我收到了方正的提示函怎么办