HDOJ--2682--Tree

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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 15:14:23

HDOJ--2682--Tree的相关文章

hdoj 2682 Tree(最小生成树)

Tree http://acm.hdu.edu.cn/showproblem.php?pid=2682 Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1855    Accepted Submission(s): 544 Problem Description There are N (2<=N<=600) cities,each

HDOJ 2682 Tree(最小生成树prim算法)

Tree Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1954    Accepted Submission(s): 573 Problem Description There are N (2<=N<=600) cities,each has a value of happiness,we consider two cities

hdu 2682 Tree 最小生成树~~~~水题一枚,,用到了筛法求素数,我竟然在格式上面PE了两次!!

Tree Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1754    Accepted Submission(s): 509 Problem Description There are N (2<=N<=600) cities,each has a value of happiness,we consider two cities

HDOJ 3516 Tree Construction

四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 868    Accepted Submission(s): 470 Problem Description Consider a two-dimensional space with a set of points (xi, yi) t

HDOJ 5044 Tree

树链剖分裸题.... 又要扩栈又要输入挂还卡格式....真无语 Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1538    Accepted Submission(s): 261 Problem Description You are given a tree (an acyclic undirected connect

HDOJ 5293 Tree chain problem LCA+树链剖分+树形DP

[题意] 给定一颗树上的几条链和每条链的权值,求能取出的不含有公共节点的链的最大权值.... [解] 预处理每条链的lca 树形DP, d[i]表示取到这个节点时可以得到的最大值 , sum[i]=sigma( d[k] | k 是i的子节点) 如果不取i  d[i]=sum[i] 如果取i , e是lca为i的链则 d[i]=max(d[i],e的权值+sigma(sum[k])-sigma(d[k]))  k为树链上的点 可以用树链剖分+树装数组在nlogn的时间复杂度内求链上的值 Tree

HDOJ 3516 Tree Construction 四边形优化dp

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意: 大概就是给你个下凸包的左侧,然后让你用平行于坐标轴的线段构造一棵树,并且这棵树的总曼哈顿距离最短 题解: 很容易得到转移方程: $$dp[i][j]=min \{ dp[i][k-1]+dp[k][j] + dis(uni(i,k-1),uni(k,j))\}$$ 其中$dp[i][j]$表示从$i$到$j$的最优解,$dis(i,j)$表示$i$和$j$之间的曼哈顿距离,$uni(i

[HDU - 2682]Tree

最小生成树. 题意就是有N座城市,每个城市有一定的幸福值a[i].对于任意两个城市i和j,如果a[i],a[j],a[i]+a[j]中任意一者的值为素数,那么他们的边权就是min(min(a[i],a[j]),abs(a[i]-a[j])).问题就是这一幅图的最小生成树.显然,边一旦建出来了,这就是一道裸题. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm&g

【HDOJ 5379】 Mahjong tree

[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根结点1可以标1或n 否则其他情况无法让下面的子树满足各自连续并且该根的儿子节点都要连续 根结点下的节点平分其他标号 画一画可以发现 每个根下最多有两颗子树 否则无法满足条件 并且两颗子树占据剩余标号的左右两边 中间夹的必须是叶子 这样才能满足该根下的儿子节点标号连续 若根下只有一颗子树 同样可以选择占剩

hdoj 4786 Fibonacci Tree 【生成树+想法】

题目:hdoj 4786 Fibonacci Tree 题意:给出 n 个点 m 条边的图,边只有两种颜色,白色和黑色,让你判断能不能让一个生成树中白边的个数为斐波那契数. 分析:这是个想法题目,前提是知道生成树的定义:生成树必须是所有点都在树中 那么既然要是斐波那契数,我只要把白色边的最大个数和最小个数求出来,如果这个范围内有斐波那契数的话,那么就满足条件. 当然这样求的前提条件是期间的所有的生成树都是满足条件的.即都是满足能够生成树的. ok,AC代码: #include<iostream>