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.
Now we want to connecte all the cities together,and make the cost minimal.
Each case begin with a integer N,then N integer Vi(0<=Vi<=1000000).
2 5 1 2 3 4 5 4 4 4 4 4
4 -1
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #define inf 9999999 int e[1100][1100]; int book[1100],a[1100]; int dis[1100]; int isprime[2010000]; int Min(int a,int b) { if( a<b) return a; return b; } int Prime(int n) { int i; if(n ==1||n==2) return 0; for(i = 2; i *i <= n; i ++) { if(n%i == 0) return 0; } return 1; } int main() { int t; int n,i,j,u,count,sum,min,flag; for(i = 1; i <= 2001000; i ++) { isprime[i] = 1; } isprime[0] = isprime[1] = 0; for(i = 1; i*i <= 2001000; i ++) { if(isprime[i]) { for(j = i*2; j <= 2001000; j = j+i) { isprime[j] = 0; } } } scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(dis,0,sizeof(dis)); memset(book,0,sizeof(book)); memset(e,0,sizeof(e)); sum = count = 0; flag = 0; u = 0; scanf("%d",&n); for(i = 1; i <= n; i ++) scanf("%d",&a[i]); for(i = 1; i <= n; i ++) for(j = 1; j <= n; j ++) { if(i == j) e[i][j] = 0; else if(isprime[a[i]]||isprime[a[j]]||isprime[a[i]+a[j]]) { e[i][j] = Min(abs(a[i]-a[j]),Min(a[i],a[j])); e[j][i] = Min(abs(a[i]-a[j]),Min(a[i],a[j])); } else { e[i][j] = inf; e[j][i] = inf; } } for(i = 1; i <= n; i ++) { dis[i] = e[1][i]; } count ++; book[1] = 1; while(count < n) { min = inf; for(i = 1; i <= n; i ++) { if(!book[i]&&dis[i]<min) { min = dis[i]; u = i; } } book[u] = 1; sum = sum + dis[u]; count ++; for(i = 1; i <= n; i ++) { if(!book[i]&&dis[i]>e[u][i]) { dis[i] = e[u][i]; } } } for(i = 1; i <= n; i ++) if(book[i]) flag++; if(flag != n) printf("-1 "); else printf("%d ",sum); } return 0; }