华为oj之素数伴侣---匈牙利算法

3 篇文章 0 订阅

版权声明:本文为博主原创文章,未经博主允许不得转载。

题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

输入:

有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。

输出:

输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。

 


输入描述:
输入说明

1 输入一个正偶数n

2 输入n个整数


输出描述:
求得的“最佳方案”组成“素数伴侣”的对数。
输入例子:
4
2 5 6 13

输出例子:
2
分析:素数和一定是奇数和偶数相加的结果,先把输入的数分成奇偶两部分,然后再用匈牙利算法
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef int bool;  
#define false 0  
#define true  1  
#define N 100  
int     edge[N][N],cx[N],cy[N];//edge记录两点的关系,如果两点相连,则edge【i】【j】为1
int visited[N];//判断该店是否被访问过
int nx,ny,res;
bool isprime (int m,int n)//判断和是否为素数
{
        int flag,i,sum=m+n;
        flag=true;
        for(i=2;i//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路
                        {
                                cx[u]=v;
                                cy[v]=u;
                                return 1;
                        }
                }
        }
        return 0;
}
int main()
{
        int n;
        while(scanf("%d",&n)!=EOF)
        {
                int i,j,a[100]={0},a1[100]={0},a2[100]={0};
                nx=0,ny=0,res=0;
                memset(cx,0xff,sizeof(cx));//初始值为-1表示两个集合中都没有匹配的元素!
        memset(cy,0xff,sizeof(cy));
                memset(edge,0,sizeof(edge));
                for(i=0;i

      {

    scanf("%d",&a[i]);

         if(a[i]%2==1)

                 a1[nx++]=a[i];

       else

                a2[ny++]=a[i];

        }

         for(i=0;i

     {

                  for(j=0;j

              {

                         if(isprime(a1[i],a2[j]))

                             edge[i][j]=1;

            }

   }

       for(i=0;i

   {

                if(cx[i]==-1)

                  {

                       memset(visited,0,sizeof(visited));

                        res+=path(i);

            }

         }

       printf("%d\n",res);

 }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值