匈牙利算法编程c语言,华为oj之素数伴侣---匈牙利算法

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

题目描述

若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如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】为1int 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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值