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

题意:两个数A和B,  A或B或者A+B是素数就表示A与B能连通。A与B连通的费用是A,B,A-B的绝对值这三个数中最小的值。

先给出n个数,问将他们都连通的最小费用。

最小生成树,判断素数是要打表。

prim算法,代码如下:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define INF 0x3f3f3f
int map[610][610],sum,prime[1000010],n;

void is_primes()//素数打表
{
	int i,j;
	prime[0]=prime[1]=1;
	for(i=2;i*i<=1000000;++i)
	{
		if(prime[i])
		  continue;
		for(j=i*i;j<=1000000;j=i+j)
		    prime[j]=1;
	}
}

int min(int a,int b)
{
	return a<b?a:b;
}

void prim()
{
	sum=0;
	int i,j,next,min;
	int lowcost[610],visit[610];
	memset(visit,0,sizeof(visit));
	for(i=0;i<n;++i)
	   lowcost[i]=map[0][i];
	visit[0]=1;//注意从零开始的
	for(i=1;i<n;++i)
	{
		min=INF;
		for(j=0;j<n;++j)
		{
			if(!visit[j]&&min>lowcost[j])
			{
				min=lowcost[j];
				next=j;
			}
		}
		if(min==INF)
		{
			printf("-1\n");
			return ;
		}
		sum+=min;
		visit[next]=1;
		for(j=0;j<n;++j)
		{
			if(!visit[j]&&lowcost[j]>map[next][j])
			    lowcost[j]=map[next][j];
		}
	}
	printf("%d\n",sum);
}

int main()
{
	is_primes();
	int t,a[610],i,j;
	scanf("%d",&t);
	while(t--)
	{
		memset(map,INF,sizeof(map));
		scanf("%d",&n);
		for(i=0;i<n;++i)
			scanf("%d",&a[i]);
		for(i=0;i<n;++i)
		{
			for(j=0;j<n;++j)
			{
				if(!prime[a[i]]||!prime[a[j]]||!prime[a[i]+a[j]])//满足素数条件记录入数组
				   map[i][j]=map[j][i]=min(min(a[i],a[j]),abs(a[i]-a[j]));
			}
		}
		prim();
	}
	return 0;
}

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

时间: 2024-10-13 22:24:07

HDOJ 2682 Tree(最小生成树prim算法)的相关文章

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

数据结构:最小生成树--Prim算法

最小生成树:Prim算法 最小生成树 给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost spanning tree). Prim算法 Prim算法是解决最小生成树的常用算法.它采取贪心策略,从指定的顶点开始寻找最小权值的邻接点.图G=<V,E>,初始时S={V0},把与V0相邻接,且边的权值最小的顶点加入到S.不断地把S中的顶点与V-S中顶点的最小权值边加入,直到所有顶点都已加入到S中

最小生成树--prim算法

一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且其总价值最低,因此,最小生成树存在的充分必要条件为图G是连通的,简单点说如下: 1.树的定义:有n个顶点和n-1条边,没有回路的称为树 生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树 最小:指的是这些边加起来的权重之和最小 2.判定条件:向生成树中任加一条边都一定构成回路 充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在 上图的红色的边加上顶点就是原图的

hdu 3371 最小生成树prim算法

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8992    Accepted Submission(s): 2519 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thoug

POJ1258最小生成树(prim算法)

POJ1258 思路:首先把第一个结点加入树中,每次往树中加入一个结点,加入的结点必须是与当前树中的结点距离最小那个点,这样每次把结点加入树中选取的都是最小权值,循环n-1次后把所有结点都加入树中. #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1e9; //创建map二维数组储存图表,low数组记录每2个点间最小权值,vis数组标记

poj1789Truck History(最小生成树prim算法)

题目链接: 啊哈哈,点我点我 思路:根据字符串中不同的长度建图,然后求图的最小生成树.. 题目: Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18272   Accepted: 7070 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for vege

最小生成树のprim算法

Problem A Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 31   Accepted Submission(s) : 10 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公

无向图最小生成树Prim算法

问题 无向图最小生成树的Prim算法.一般的实现过程,采用了常规排序.本文在用Python实现中,使用了python的堆排序模块,不仅精简代码,而且提高效率. 思路说明 假设点A,B,C,D,E,F,两点之间有连线的,以及它们的距离分别是:(A-B:7);(A-D:5);(B-C:8);(B-D:9);(B-E:7);(C-E:5);(D-E:15);(D-F:6);(E-F:8);(E-G:9);(F-G:11) 关于Prim算法的计算过程,参与维基百科的词条:[普里姆算法] 将上述点与点关系

E - Agri-Net (最小生成树) -- prim算法

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=193#problem/E prim算法 思想和步骤总结 (自己所写) dis[],map[][],vis[],pos ,min,ans(主要定义的变量) 首先,prim算法用于计算图边径长度已知的图,它所求的是将图中所有顶点相连接,所需要的最短路径的长度,prim算法适合计算稠密图,它的主要思想是贪心思想,贪心准则为每次选择未加入树中且距离树最小的顶点,并用dis[]数组不断更