单击666传送
Tree
Problem Description
There are N (2<=N<=600) cities,each has a value of happiness,we consider two cities A and B whose value of happiness are VA and VB,if VA is a prime number,or VB is a prime number or (VA+VB) is a prime number,then they can be connected.What’s more,the cost to connecte two cities is Min(Min(VA , VB),|VA-VB|).
Now we want to connecte all the cities together,and make the cost minimal.
Input
The first will contain a integer t,followed by t cases.
Each case begin with a integer N,then N integer Vi(0<=Vi<=1000000).
Output
If the all cities can be connected together,output the minimal cost,otherwise output “-1”;
Sample Input
2
5
1
2
3
4
5
4
4
4
4
4
Sample Output
4
-1
Author
Teddy
最小生成树,无非是加了个素数判断,数不是很大,筛一下就好的
#include <cstdio>
#include <cmath>
#include <cstring>
#define INF 0x3f3f3f
int map[610][610],s,n;
const int N=2000005;
bool pri[N];
void Prime(){
pri[0]=1;
pri[1]=1;
for(int i=2;i<=sqrt(N);i++)
if(!pri[i]){
for(int j=i*i;j<=N;j+=i)
pri[j]=1;
}
}
int abs(int n){
if(n<0)n=-n;
return n;
}
int min(int a,int b)
{
return a<b?a:b;
}
void prim()
{
s=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 ;
}
s+=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",s);
}
int main()
{
Prime();
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(!pri[a[i]]||!pri[a[j]]||!pri[a[i]+a[j]])
map[i][j]=map[j][i]=min(min(a[i],a[j]),abs(a[i]-a[j]));
}
}
prim();
}
return 0;
}