简介
使用匈牙利算法进行匹配
code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <memory.h>
using namespace std;
vector<int> G[105];
bool flag[105];
int pre[105];
bool dfs(int k){
int x;
for(int i=0; i<G[k].size(); i++){
x = G[k][i];
if(flag[x]) continue;
flag[x] = true;
if((pre[x] == 0 || dfs(pre[x]))) {
pre[x] = k;
return true;
}
}
return false;
}
bool isprime[80000];
int nums[105];
int main() {
memset(isprime, 1, sizeof(isprime));
isprime[0]=isprime[1] = false;
for(int i=4; i<80000; i+=2) {
isprime[i]=false;
}
for(int i=3; i*i<80000; i+=2){
if(isprime[i]){
for(int j=i*i; j<80000; j+=2*i) isprime[j] = false;
}
}
int n;
while(~scanf("%d", &n)) {
for(int i=1; i<=n; i++) {
scanf("%d", &nums[i]);
}
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; ++j){
if(isprime[nums[i] + nums[j]]) {
(nums[i] & 1) ? G[i].push_back(j):G[j].push_back(i);
}
}
}
memset(pre, 0, sizeof(pre));
int ans = 0;
for(int i=1; i<=n; i++){
memset(flag, false, sizeof(flag));
if(dfs(i)) ans++;
}
printf("%d\n", ans);
for(int i=1; i<=n; i++){
G[i].clear();
}
}
return 0;
}
---------------------------我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。我从来就没有太阳,所以不怕失去。
--------《白夜行》