Arctic Network北极网络(Prim算法&&Kruskal算法)

Arctic Network北极网络

目录

Arctic Network北极网络

题意描述

Kruskal算法解题思路

易错分析

Kruskal AC代码

Prim解题思路

易错分析

Prim AC代码


The Department of National Defence (DND) wishes to connect several northern outposts by a wireless network. Two different communication technologies are to be used in establishing the network: every outpost will have a radio transceiver and some outposts will in addition have a satellite channel.
Any two outposts with a satellite channel can communicate via the satellite, regardless of their location. Otherwise, two outposts can communicate by radio only if the distance between them does not exceed D, which depends of the power of the transceivers. Higher power yields higher D but costs more. Due to purchasing and maintenance considerations, the transceivers at the outposts must be identical; that is, the value of D is the same for every pair of outposts.

Your job is to determine the minimum D required for the transceivers. There must be at least one communication path (direct or indirect) between every pair of outposts.

Input

The first line of input contains N, the number of test cases. The first line of each test case contains 1 <= S <= 100, the number of satellite channels, and S < P <= 500, the number of outposts. P lines follow, giving the (x,y) coordinates of each outpost in km (coordinates are integers between 0 and 10,000).

Output

For each case, output should consist of a single line giving the minimum D required to connect the network. Output should be specified to 2 decimal points.

国防部 (DND) 希望通过无线网络连接几个北方前哨。建立网络时将使用两种不同的通信技术:每个前哨站将有一个无线电收发器,一些前哨站还将有一个卫星频道。
任何两个有卫星频道的哨站都可以通过卫星进行通信,无论它们位于何处。否则,两个哨站只有在它们之间的距离不超过 D 时才能通过无线电通信,这取决于收发器的功率。更高的功率产生更高的 D,但成本更高。出于采购和维护的考虑,前哨的收发器必须相同;也就是说,每对前哨站的 D 值都相同。

您的工作是确定收发器所需的最小 D。每对前哨站之间必须至少有一条通信路径(直接或间接)。

输入

输入的第一行包含 N,测试用例的数量。每个测试用例的第一行包含 1 <= S <= 100(卫星频道数)和 S < P <= 500(前哨站数)。跟随 P 行,给出每个前哨站的 (x,y) 坐标(以公里为单位)(坐标是 0 到 10,000 之间的整数)。

输出

对于每种情况,输出应由一条线组成,给出连接网络所需的最小 D。输出应指定为 2 个小数点。

Sample Input

1
2 4
0 100
0 300
0 600
150 750

Sample Output

212.13

题意描述:

给你多组数据,第一行是卫星频道数何前哨战数,根据题目要求,把卫星频道给距离相差很远的前哨,然后求剩下没有卫星频道的相距最远的前哨间距离

Kruskal算法解题思路:

用了kruskal,写两个for循环来求给的点之间的距离,然后把距离进行排序,最后输出除了放卫星排序最大的距离。

易错分析:

题目要求的是小数,所以我们在计算距离和在单独写kruskal函数的时候注意定义成define 然后就是多实例问题,注意初始化数据的时候位置不要放错

当然如果这个数据特别大的话,可能会时间超限,这种题还是比较适合prim (下面有。)

Kruskal AC代码

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int m,n,cnt,fa[550];
struct Node
{
	int a,b;
	double d;//
}p[250020];

void init()//并查集初始化 
{
	int i;
	for(int i=1;i<=550;i++)
	{
		fa[i]=i;
	}
}

int cmp(Node x, Node y)
{
	return x.d<y.d;//结构体从小到大排序 
}
 
int find(int x)//寻找祖先
{
	if(x==fa[x])
		return x;
	else 
		return fa[x]=find(fa[x]);
} 

double kruskal()//这里也要用double !!! 
{
	int rec=0;
	sort(p,p+cnt,cmp);// !!!!
	double ans=0;//
	for(int i=1;i<cnt;i++)//
	{
		if(rec==m-n)
			break;//直到选用了n-1条边之后退出循环
		int x=find(p[i].a),y=find(p[i].b);
		if(x!=y)
		{
			fa[x]=y;
			ans=p[i].d;
			rec++;
		 } 
	}
	return ans;
	
}

int main(void)
{
	int t;
//	cnt=1;放while循环里面 
	double x[550],y[550];//因为下面求的是double 所以也要用double !!!!!
	scanf("%d",&t);
	while(t--)
	{
		cnt=1; 
		scanf("%d %d",&n,&m);//n代表卫星数,m表有多少个前哨站
		init();//初始化 
		for(int i=1;i<=m;i++)
		{
			scanf("%lf %lf",&x[i],&y[i]);//注意书写格式 
		}
		double a;
		for(int i=1;i<=m;i++)
		{
			for(int j=i+1;j<=m;j++)
			{
			//	a=sqrt((x[i]-x[j])*((x[i]-x[j]))+(y[i]-y[j])*(y[i]-y[j]));
				p[cnt].a=i;//简写成1,2 
				p[cnt].b=j;//
				p[cnt].d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
				cnt++;
				//printf("%.2f\n",a);
			}
		}	
		printf("%.2f\n",kruskal());
		
	}
	
	return 0;
 }

Prim解题思路:

因为有坐标,所以我们把前一个点和后一个点的距离存入二维数组,然后利用prim算法 可以为我们求得所有点通过的最短路,因为我们要求的是除了有卫星频道是最长的边之外,其它最长的一条边的长度,所以我们要把所有的值进行排序,然后输出那个值

易错分析:

因为我是从1开始定义的,所以排序的时候sort(dis,dis+卫星数+1)输出也是dis[n-m+1],感兴趣的可以看下我下面排序的代码,那两个for循环,自己输入题目给的数据,会发现sort按0开始,但是如果定义1开头的话,就要再加1

Prim AC代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define  N 1050
using namespace std;
int  n,m,book[N];
double e[N][N],dis[N]; 
double inf=9999999.0;
void Prim()
{
	double min;
	int u;
	for(int i=1;i<=n;i++)
	{
		dis[i]=e[1][i];
		book[i]=0;
	}
	//dis[1]=0;
	book[1]=1;
	for(int i=1;i<n;i++)
	{	
		min=inf;
		for(int j=1;j<=n;j++)
		{
			if(book[j]==0&&dis[j]<min)
			{
				min=dis[j];
				u=j;
			}
		}
		book[u]=1;
		for(int k=1;k<=n;k++)
		{
			if(book[k]==0&&dis[k]>e[u][k])
			{
				dis[k]=e[u][k];
			}
		}
		
		
	}
//	for(int i=1;i<=n;i++)  就是这两个for循环!!!!🤐
//		{
//			printf("%.2f\n",dis[i]);
//		}
	sort(dis,dis+n+1);//
//	for(int i=1;i<=n;i++)
//		{
//			printf("%.2f\n",dis[i]);
//		}
	printf("%.2f\n",dis[n-m+1]);//	
	
}

int main(void)
{
	int t;
	double x[N],y[N];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&m,&n);
		//读入边 
		for(int i=1;i<=n;i++)
		{
			scanf("%lf %lf",&x[i],&y[i]);
			for(int j=1;j<=n;j++)
			{
				e[i][j]=e[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
			}
		}
		
		
		Prim();
	}
	return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、引言 在现代的人机交互中,语音合成技术得到了广泛的应用。语音合成技术是一种将文字转化为语音的技术,可以为人们提供方便、快捷的交互方式。目前,语音合成技术已经被广泛应用于语音交互、智能家居、语音导航等领域。在语音合成技术中,PSOLA算法是一种常用的语音合成算法,其优点在于速度快、计算量小、效果好等。 本文主要介绍PSOLA算法的原理及其实验设置、实验结果分析,以便更好地理解这种算法。 二、PSOLA算法的原理 PSOLA算法(Pitch Synchronous Overlap and Add)是一种基于重叠相加技术的语音合成算法,其主要思想是利用语音信号的基音周期性特征,在不同时间尺度上对语音信号进行重叠相加,从而实现语音合成。PSOLA算法的基本原理是将语音信号分为若干个基音周期,并将每个基音周期进行处理。具体来说,PSOLA算法的处理过程包括以下几个步骤: 1. 基音周期的检测 首先,需要对语音信号进行分析,找出语音信号中的基音周期。基音周期是指语音信号中的一段时间内,声带振动的周期性变化。通常情况下,基音周期的长度为10-30毫秒。 2. 基音周期的定位 在检测到基音周期之后,需要将基音周期进行定位。定位基音周期的目的是为了将语音信号分为若干个基音周期,以便对每个基音周期进行处理。在定位基音周期的过程中,需要使用基音周期的长度和位置信息。 3. 重叠相加 在定位基音周期之后,需要对每个基音周期进行处理。具体来说,需要将每个基音周期进行重叠相加。重叠相加的过程是将相邻的两个基音周期进行重叠,然后将它们相加。这样可以使得语音信号在时间尺度上得到扩展,从而实现语音合成。 4. 调整基音周期的位置 在进行重叠相加的过程中,需要注意基音周期的位置。如果基音周期的位置不正确,就会导致语音信号合成后的效果不佳。因此,在进行重叠相加的过程中,需要对基音周期的位置进行微调,以便得到更好的合成效果。 5. 合成语音信号 最后,将所有基音周期进行重叠相加,并进行基音周期位置微调,得到最终的合成语音信号。 三、实验设置 为了验证PSOLA算法的效果,我们进行了一系列的实验。实验使用的语音数据集是CMU Arctic语音数据集。 在实验中,我们使用了Python语言进行编程,并使用了Python的科学计算库NumPy和声音处理库PyAudio。具体实验设置如下: 1. 数据预处理 首先,需要对CMU Arctic语音数据集进行预处理。具体来说,需要对语音信号进行分析,找出语音信号中的基音周期,并将语音信号分为若干个基音周期。 2. 实验对象 在实验中,我们选择了几个具有代表性的语音信号作为实验对象。这些语音信号包括男性声音、女性声音、婴儿声音等。 3. 实验参数设置 在实验中,我们设置了以下参数: (1)基音周期长度:20毫秒; (2)重叠比例:50%; (3)基音周期位置微调量:10%。 以上参数是根据实验结果进行调整的。 4. 实验结果分析 在实验中,我们将PSOLA算法合成的语音信号与原始语音信号进行对比,以评估PSOLA算法的效果。具体来说,我们对比了合成语音信号与原始语音信号的基音周期、频谱图、时域图等,并对实验结果进行了分析。 四、实验结果分析 实验结果表明,PSOLA算法可以有效地实现语音合成。具体来说,PSOLA算法合成的语音信号与原始语音信号之间的基音周期相似度高,在频谱图和时域图上也具有较好的相似性。此外,PSOLA算法的处理速度快,计算量小,效果好等优点,使得它在语音合成领域得到了广泛的应用。 综上所述,PSOLA算法是一种非常有效的语音合成算法。它的原理简单,实现容易,效果好,速度快等优点使得它在语音合成领域得到了广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值