码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ--2682--Tree

时间:2017-07-07 13:30:18      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:mini   map   class   scan   tle   des   没有   --   style   

Tree

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


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
2 5 1 2 3 4 5 4 4 4 4 4
 

Sample Output
4 -1
 题意:基本都能看懂题们就不絮絮叨叨了。
思路:注意。一定要用打表。不然就会一直wa 甚至我都没有超时。而是一直wa无语。

上代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define INF 0x3f3f3f3f
#define min(a,b) a<b?a:b
int n,vis[601],map[601][601],dis[601],flag,sum,prim[1000010];
void fun(){
	memset(prim,0,sizeof(prim));
	for(int i=2;i<=1000010;i++)
		if(!prim[i])
			for(int j=i*2;j<=1000010;j+=i)
				prim[j]=1;
	prim[1]=1;
}
void prime(){
	memset(vis,0,sizeof(vis));//标记函数没有初始化。 
	int i;
	for(i=1;i<=n;i++)
		dis[i]=map[1][i];
	vis[1]=1;
	flag=0;
	sum=0;
	for(i=1;i<n;i++){
		int temp=INF,j,k;
		for(j=1;j<=n;j++)
			if(vis[j]==0&&dis[j]<temp)
				temp=dis[k=j];
		if(temp==INF){
			flag=1;
			break;
		}
		sum+=temp;
		vis[k]=1;
		for(j=1;j<=n;j++)
			if(vis[j]==0&&dis[j]>map[k][j])
				dis[j]=map[k][j];
	}
}
int main(){
	int T,a[601];
	scanf("%d",&T);
	while(T--){	
		memset(map,INF,sizeof(map));
		scanf("%d",&n);
		fun();
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
				if(!prim[a[i]]||!prim[a[j]]||!prim[a[j]+a[i]]){
					int l=min(a[i],a[j]);
					int l2=min(l,abs(a[i]-a[j]));
					map[i][j]=map[j][i]=l2;
				}
		prime();
		if(flag)
			printf("-1\n");
		else
			printf("%d\n",sum);	
	}
	return 0;
}



HDOJ--2682--Tree

标签:mini   map   class   scan   tle   des   没有   --   style   

原文地址:http://www.cnblogs.com/jhcelue/p/7131185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!