Tree 2682

来源:互联网 发布:机械矩阵沙盘排名 编辑:程序博客网 时间:2024/05/17 04:26

Tree

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1951    Accepted Submission(s): 572


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
251234544444
 

Sample Output
4-1
//prim算法 #include<stdio.h>#include<string.h>#include<math.h>#define mx 0x3f3f3f3f#define min(a,b) (a>b?b:a)int s[1000010*2],a[610],g[610][610],vis[610],dis[610];int n;void find(){int i,j;s[1]=1;for(i=2;i<1000010*2;i++){if(!s[i]){for(j=i+i;j<1000010*2;j+=i){s[j]=1;}}}}int prim(){int i,j,k,min;int sum=0;memset(vis,0,sizeof(vis));for(i=1;i<=n;i++)dis[i]=g[1][i];dis[1]=0;vis[1]=1;for(i=1;i<n;i++){k=-1;min=mx;for(j=1;j<=n;j++){if(!vis[j]&&dis[j]<min){min=dis[j];k=j;}}if(k==-1)break;sum+=dis[k];vis[k]=1;for(j=1;j<=n;j++){if(!vis[j]&&dis[j]>g[k][j]){dis[j]=g[k][j];}}}if(i<n)return -1;elsereturn sum;}int main(){int t;scanf("%d",&t);find();while(t--){int i,j;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=0;i<=n;i++){for(j=0;j<=n;j++){g[i][j]=mx;}}for(i=1;i<=n;i++){for(j=i+1;j<=n;j++){if(!s[a[i]] || !s[a[j]] || !(s[a[i]+a[j]]) ){g[i][j] = g[j][i] = min( min(a[i],a[j]), abs(a[i]-a[j]) );}}}printf("%d\n",prim());}return 0;}#include<stdio.h>#include<string.h>#include<math.h>#define mx 0x3f3f3f3f#define min(a,b) (a>b?b:a)int s[1000010*2],a[610],g[610][610],vis[610],dis[610];int n;void find(){int i,j;s[1]=1;for(i=2;i<1000010*2;i++){if(!s[i]){for(j=i+i;j<1000010*2;j+=i){s[j]=1;}}}}void prim(){int i,j,k,min;int sum=0;memset(vis,0,sizeof(vis));for(i=1;i<=n;i++)dis[i]=g[1][i];dis[1]=0;vis[1]=1;for(i=1;i<n;i++){k=-1;min=mx;for(j=1;j<=n;j++){if(!vis[j]&&dis[j]<min){min=dis[j];k=j;}}if(min==mx){printf("-1\n");return ;}sum+=dis[k];vis[k]=1;for(j=1;j<=n;j++){if(!vis[j]&&dis[j]>g[k][j]){dis[j]=g[k][j];}}}printf("%d\n",sum);}int main(){int t;scanf("%d",&t);find();while(t--){int i,j;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=0;i<=n;i++){for(j=0;j<=n;j++){g[i][j]=mx;}}for(i=1;i<=n;i++){for(j=i+1;j<=n;j++){if(!s[a[i]] || !s[a[j]] || !(s[a[i]+a[j]]) ){g[i][j]=g[j][i]=min(min(a[i],a[j]),abs(a[i]-a[j]));}}}prim();}return 0;}
#include<stdio.h>#include<string.h>#include<math.h>#define mx 0x3f3f3f3f#define min(a,b) (a>b?b:a)int s[1000010*2],dis[610],v[610],a[610],g[610][610];int n;void fun(){int i,j;s[1]=1;for(i=2;i<1000010*2;i++){if(!s[i]){for(j=i+i;j<1000010*2;j+=i){s[j]=1;}}}}void prim(){int i,j,k,min,sum=0;memset(v,0,sizeof(v));for(i=1;i<=n;i++){dis[i]=g[1][i];}dis[1]=0;v[1]=1;for(j=1;j<n;j++){min=mx;k=1;for(i=1;i<=n;i++){if(!v[i]&&dis[i]<min){min=dis[i];k=i;}}if(min==mx){printf("-1\n");return ;}sum+=min;v[k]=1;for(i=1;i<=n;i++){if(!v[i]&&dis[i]>g[k][i]){dis[i]=g[k][i];}}}printf("%d\n",sum);}int main(){int t;scanf("%d",&t);fun();while(t--){int i,j;scanf("%d",&n);for(i=0;i<=n;i++){for(j=0;j<=n;j++){if(i==j)g[i][j]=0;elseg[i][j]=mx;}}for(i=1;i<=n;i++){scanf("%d",&a[i]);}for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(!s[a[i]]||!s[a[j]]||!s[a[i]+a[j]]){g[i][j]=g[j][i]=min(min(a[i],a[j]),abs(a[i]-a[j]));}}}prim();}return 0;}


0 0
原创粉丝点击