2 5 1 2 3 4 5 4 4 4 4 4
4 -1
//++ 史上第一坑,我都开始质疑我的编程习惯了,注释的部分是 wa了 30多次的代码
//将宏定义 改成直接调用algorithm库里面的函数直接就对了。。。。之前的有道题
//同样的代码使用了宏定义,这样更节省了时间,果断AC,于是当时决定使用宏定义,
//看来我该好好反省一下自己的人生了!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//#define min(a,b) a>b?b:a
#include<algorithm>
using namespace std;
#define inf 0xfffffff
int a[2000200];
int map[1100][1100],dis[1100],visit[1100],b[1100];
int n;
void f()
{
int i,j;
a[1]=1,a[0]=1;
for(i=2;i*i<=2000000;i++)
{
if(!a[i])
{
for(j=i*i;j<=2000000;j+=i)
{
a[j]=1;
}
}
}
}
void prime()
{
int i,j,pos=1,min,sum=0;//此处的sum可定义为__int64 位的 避免超出 但是这道题数据很水 ,上面判定素数的时候定义到100万就能AC
memset(visit,0,sizeof(visit));
for(i=1;i<=n;++i)
{
dis[i]=map[1][i];
}
visit[1]=1;
for(i=1;i<n;++i)
{
min=inf;
for(j=1;j<=n;++j)
{
if(!visit[j]&&dis[j]<min)
{
pos=j;
min=dis[j];
}
}
if(min==inf)
{
printf("-1\n");
return ;
}
visit[pos]=1;
sum+=min;
for(j=1;j<=n;++j)
{
if(!visit[j]&&dis[j]>map[pos][j])
{
dis[j]=map[pos][j];
}
}
}
printf("%d\n",sum);
}
int main()
{
int t;
int i,j;
scanf("%d",&t);
f();
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&b[i]);
}
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
}
for(i=1;i<=n;++i)
{
for(j=i+1;j<=n;++j)
{
if( (!(a[b[i]])) || !a[b[j]] || !a[b[i]+b[j]])
{
int minx=min(min(b[i],b[j]),abs(b[i]-b[j]));
if(minx<map[i][j])
map[i][j]=map[j][i]=minx;
}
}
}
prime();
}
return 0;
}原文地址:http://blog.csdn.net/ice_alone/article/details/44779239