2 5 1 2 3 4 5 4 4 4 4 4
4 -1
#include<stdio.h>
#include<math.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define min(a,b) a<b?a:b
int n,vis[601],map[601][601],dis[601],flag,sum,prim[1000010];
void fun(){
	memset(prim,0,sizeof(prim));
	for(int i=2;i<=1000010;i++)
		if(!prim[i])
			for(int j=i*2;j<=1000010;j+=i)
				prim[j]=1;
	prim[1]=1;
}
void prime(){
	memset(vis,0,sizeof(vis));//标记函数没有初始化。 
	int i;
	for(i=1;i<=n;i++)
		dis[i]=map[1][i];
	vis[1]=1;
	flag=0;
	sum=0;
	for(i=1;i<n;i++){
		int temp=INF,j,k;
		for(j=1;j<=n;j++)
			if(vis[j]==0&&dis[j]<temp)
				temp=dis[k=j];
		if(temp==INF){
			flag=1;
			break;
		}
		sum+=temp;
		vis[k]=1;
		for(j=1;j<=n;j++)
			if(vis[j]==0&&dis[j]>map[k][j])
				dis[j]=map[k][j];
	}
}
int main(){
	int T,a[601];
	scanf("%d",&T);
	while(T--){	
		memset(map,INF,sizeof(map));
		scanf("%d",&n);
		fun();
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
				if(!prim[a[i]]||!prim[a[j]]||!prim[a[j]+a[i]]){
					int l=min(a[i],a[j]);
					int l2=min(l,abs(a[i]-a[j]));
					map[i][j]=map[j][i]=l2;
				}
		prime();
		if(flag)
			printf("-1\n");
		else
			printf("%d\n",sum);	
	}
	return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/gui951753/article/details/47622443