2 5 1 2 3 4 5 4 4 4 4 4
4 -1
#include<cstdio> #include<cstring> #include<cstdlib> #define INF 0x3f3f3f int map[610][610],sum,prime[1000010],n; void is_primes()//素数打表 { int i,j; prime[0]=prime[1]=1; for(i=2;i*i<=1000000;++i) { if(prime[i]) continue; for(j=i*i;j<=1000000;j=i+j) prime[j]=1; } } int min(int a,int b) { return a<b?a:b; } void prim() { sum=0; int i,j,next,min; int lowcost[610],visit[610]; memset(visit,0,sizeof(visit)); for(i=0;i<n;++i) lowcost[i]=map[0][i]; visit[0]=1;//注意从零开始的 for(i=1;i<n;++i) { min=INF; for(j=0;j<n;++j) { if(!visit[j]&&min>lowcost[j]) { min=lowcost[j]; next=j; } } if(min==INF) { printf("-1\n"); return ; } sum+=min; visit[next]=1; for(j=0;j<n;++j) { if(!visit[j]&&lowcost[j]>map[next][j]) lowcost[j]=map[next][j]; } } printf("%d\n",sum); } int main() { is_primes(); int t,a[610],i,j; scanf("%d",&t); while(t--) { memset(map,INF,sizeof(map)); scanf("%d",&n); for(i=0;i<n;++i) scanf("%d",&a[i]); for(i=0;i<n;++i) { for(j=0;j<n;++j) { if(!prime[a[i]]||!prime[a[j]]||!prime[a[i]+a[j]])//满足素数条件记录入数组 map[i][j]=map[j][i]=min(min(a[i],a[j]),abs(a[i]-a[j])); } } prim(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/zwj1452267376/article/details/47486159