hdoj--2682--Tree()

来源:互联网 发布:淘宝卖视频教程赚钱吗 编辑:程序博客网 时间:2024/05/16 12:31

Tree

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



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
 

Author
Teddy
 

Source
2009浙江大学计算机研考复试(机试部分)——全真模拟
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  2677 2683 2678 2676 2681


#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 0xfffffff#define min(a,b)(a>b?b:a)int map[1010][1010],p[1000010*2],mark[1010],num[1010];int n;void fun(){    int i,j;    p[1]=1;    for(i=2;i<1000010*2;i++)    {        if(!p[i])        {            for(j=i+i;j<1000010*2;j+=i)            {                p[j]=1;            }        }    }}int prim(){    int sum=0,p=n,i,j;    int flog;    memset(mark,0,sizeof(mark));    while(--p)    {        int min=INF;        for(i=2;i<=n;i++)        {            if(!mark[i]&&map[1][i]<min)            {                min=map[1][i];                flog=i;            }        }        if(min==INF)        break;        sum+=min;        mark[flog]=1;        for(j=2;j<=n;j++)        {            if(!mark[j]&&map[1][j]>map[flog][j])            map[1][j]=map[flog][j];        }    }    if(p) return -1;    else     return sum;}int main(){    int t;    fun();    scanf("%d",&t);    while(t--)    {        int i,j;        scanf("%d",&n);        for(i=1;i<=n;i++)        scanf("%d",&num[i]);        for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        map[i][j]=INF;        for(i=1;i<=n;i++)        {            for(j=i+1;j<=n;j++)            {                if(!p[num[i]]||!p[num[j]]||!p[num[i]+num[j]])                {                    map[j][i]=map[i][j]=min(min(num[i],num[j]),abs(num[i]-num[j]));                }            }        }        printf("%d\n",prim());    }    return 0;}


 
0 0
原创粉丝点击