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