hdu 2682 Tree

来源:互联网 发布:java语法有多少 编辑:程序博客网 时间:2024/05/16 14:47

点击打开链接

和hdu1875一样的

#include<stdio.h>#include<string.h>#include<math.h>#define inf 99999999#define N 610int map[N][N],v[N],dis[N],n,sum,num[N],a[1000005];int min(int a,int b,int c){if(a>b)a=b;if(a>c)a=c;return a;}void prm(){memset(a,0,sizeof(a));a[0]=a[1]=1;for(int i=2;i<=1000000;i++)if(!a[i])for(int j=i+i;j<=1000000;j+=i)a[j]=1;}void DIJ(){int i,j,tem,t;memset(v,0,sizeof(v));for(i=1;i<=n;i++)dis[i]=map[1][i];v[1]=1;dis[1]=0;for(i=1;i<n;i++){tem=inf;for(j=1;j<=n;j++){if(!v[j]&&tem>dis[j]){tem=dis[j];t=j;}}if(tem==inf){sum=-1;break;}v[t]=1;sum+=tem;for(j=1;j<=n;j++){if(!v[j]&&map[t][j]<dis[j])dis[j]=map[t][j];}}}int main(){int m,i,j,t;prm();scanf("%d",&t);while(t--){sum=0;scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=n;j++)map[i][j]=inf;for(i=1;i<=n;i++)scanf("%d",&num[i]);for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(!a[num[i]]||!a[num[j]]||!a[num[i]+num[j]]){int temp=min(num[i],num[j],abs(num[i]-num[j]));if(map[i][j]>temp)map[i][j]=map[j][i]=temp;}}DIJ();printf("%d\n",sum);}return 0;}


0 0
原创粉丝点击