QS network——prim

Description

在盖乐世cgb的行星w-503,有一种智能生物叫 QS。QS通过网络互相通讯。如果两个QS想连接, 他们需要购买2个网络适配器(一个给对方 )。请注意,一个网络适配器只能使用在一个单一的 连接。(例如,如果一个QS想设置四个连接,需要购买四 适配器)。在通信的过程中,一个QS广播它的消息(通讯网联通),收到消息的QS广播给连接的所有 QS,重复这个过程,直到所有的 QS的收到的消息。

下面是一个示例:


 




步骤1。QS A一发送消息给QS B和 QS C;

步骤2。QS B发送消息给QS A ;QS C发送消息到QS A和QS D;

步骤3。因为所有的QS收到消息,程序终止。

每个QS有其最喜欢的品牌的网络适配器和总是在其所有的连接上用其最喜欢的品牌的网络适配器。在QS的距离发生变化。你的任务是写一个程序来确定最小成本 设置一个QS网络。
 

Input

输入的第一行包含一个整数T,表示数据集的数量 。
从第二行有数据集。
在一个单一的数据集,第一行包含一个整数N,表示数量的 QS。
第二行包含N个整数,表示每个QS的最喜欢的 网络适配器的价格。
在第三线的N +第二行包含一个矩阵表示电缆 QS各对之间的价格。

Constrains:
在输入所有的整数都是非负的,不超过1000。

Output

对于每个数据集,输出一行的最小成本。不需要额外的空行。

Sample Input
1
3
10 20 30
0 100 200
100 0 300
200 300 0

Sample Output
370
分析

prim算法求最短路

邻接矩阵存储图,并且对于每个点都有一个权值p[i],每次加入一个点时,将该点的权值加到与其相连的边上,然后求出最小生成树的权值和。

prim

Prim算法是一种用于构建最小生成树的贪心算法。它的基本思想是从一个点开始,每次选择一个与当前生成树距离最小的点加入生成树,直到所有点都被加入为止。下面是Prim算法的基本步骤:

  1. 选择一个起始点,将其加入生成树中。
  2. 找到与生成树相邻的所有边中权值最小的边,将其连接的点加入生成树中。
  3. 重复步骤2,直到所有点都被加入为止。
代码
​
#include<bits/stdc++.h>
#define N 1020
using namespace std;
int t,n,a[N][N],d[N],p[N],w,mst;
bool vis[N];
void prim(){
	memset(d,0x3f3f3f,sizeof(d));
	memset(vis,false,sizeof(vis));
	d[1]=0;
	mst=0;
	for(int i=1;i<=n;i++){
		int k=0;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&d[j]<d[k]) k=j;
		}
		vis[k]=true;
		mst+=d[k];
		for(int j=1;j<=n;j++){
			if(!vis[j]&&a[k][j]<d[j]) d[j]=a[k][j];
			
		}
	}
}
int main(){
	cin>>t;
	for(int i=1;i<=t;i++){
		
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>p[i];
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				cin>>a[i][j];
				a[i][j]+=p[i]+p[j];
			}
		}
		prim();
		cout<<mst<<endl;
	}

	return 0;
} 

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值