8.3 H

来源:互联网 发布:校园网络诈骗小品剧本 编辑:程序博客网 时间:2024/06/06 18:07

                                    H - 这是水题8


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
251234544444
Sample Output
4-1

题意:输入T组数据,然后每组数据有n个数字,这n个数字如果其中任意两个其中一个为素数或者他们的和为素数,表示这两个点可以连通,这两个点的权值为这两个数字和这两个数字差的最小值。

思路:先将题目中要求的数据量的素数打表,然后将数据处理成坐标点和权值的方式,生成最小生成树。

#include<stdio.h>#include<string.h>int a[2000][2000],book[2000];int s[2150000];int d[2000],e[2000];int Min(int x,int y)//大小比较函数{if(x>y)x=y;return x;}int ads(int x)//当两点之差为负数时重置为正{if(x<0)x=-x;return x;}int main(){int i,j,k,m,n,c,T,f;int max=1e9,min,sum;for(i=0;i<=2100000;i++){s[i]=1;}s[0]=s[1]=0;for(i=2;i<=2100000;i++)//素数打表{if(s[i]==1){for(j=2;j*i<=2100000;j++){s[j*i]=0;}}}while(scanf("%d",&T)!=EOF){while(T--){memset(a,0,sizeof(a));memset(d,0,sizeof(d));memset(book,0,sizeof(book));m=0;scanf("%d",&n);for(i=1;i<=n;i++)//存储数据{scanf("%d",&e[i]);}for(i=0;i<=n;i++){for(j=0;j<=n;j++){if(i==j){a[i][j]=0;}else{a[i][j]=max;}}}//初始化for(i=1;i<=n;i++){for(j=i+1;j<=n;j++){if(s[e[i]]==1||s[e[j]]==1||s[e[i]+e[j]]==1)//判断是否符合存储条件{a[i][j]=Min(Min(e[i],e[j]),ads(e[i]-e[j]));//存储权值a[j][i]=Min(Min(e[i],e[j]),ads(e[i]-e[j]));}}}for(i=1;i<=n;i++){d[i]=a[1][i];}book[1]=1;m++;sum=0;f=0;while(m<n){min=max;for(i=1;i<=n;i++){if(book[i]==0&&d[i]<min){min=d[i];j=i;}}m++;book[j]=1;sum+=d[j];for(i=1;i<=n;i++){if(book[i]==0&&a[j][i]<d[i]){d[i]=a[j][i];}}}for(i=1;i<=n;i++)//判断是否连通{if(book[i]==1){f++;}}if(f==n){printf("%d\n",sum);}else{printf("-1\n");}}}return 0;}



原创粉丝点击