概述
题目
Partychen担任系统管理员,并计划在他的公司建立一个新的网络。该公司将有N个集线器,它们可以通过电缆相互连接。由于公司的每个员工都必须能够访问整个网络,因此每个集线器必须可以通过任何其他集线器(可能有一些中间集线器)的电缆访问。
由于可以使用不同类型的电缆,且较短的电缆更便宜,因此有必要制定这样的集线器连接计划,以使成本最低。partychen将为您提供有关可能的集线器连接的所有必要信息。您将帮助partychen找到连接集线器的方法,以便满足上述所有条件。
输入格式
输入的第一行包含两个整数:N-网络中的集线器数量(2<=N<=1000)和M-可能的集线器连接数量(1<=M<=15000)。所有集线器的编号范围为1到N。以下M行包含有关可能连接的信息-可以连接的两个集线器的编号以及连接它们所需的电缆成本。成本是一个不超过106的正整数。将始终至少有一种方式连接所有集线器。
输出格式
输出集线器连接计划的最低成本。
思路
最小生成树
代码
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
int mark[2000];
int dis[2000];
vector<vector<pair<int,int>>>v;//first->去的地方 second->cost
int main()
{
int n, m;
cin >> n >> m;
v.resize(2000);//要扩容。。不然越界
for(int i = 0 ; i < m; i++)
{
int start, end, cost;
cin >> start >> end >> cost;
v[start].push_back({end, cost});
v[end].push_back({start, cost});
}
memset(dis, INF, sizeof(dis));
memset(mark, 0 ,sizeof(mark));
dis[1] = 0;
int through = 0;
int sum = 0;
while(through < n)
{
int min_index = 0;
for(int i = 1; i <= n; i++)
{
if(!mark[i] && dis[min_index] > dis[i])
min_index = i;//没经过这个点并且有更短的距离
}
if(min_index == 0) break;//break说明连通分量不为1
sum += dis[min_index];
mark[min_index] = 1;
through++;
for(auto data : v[min_index])
if(dis[data.first] > data.second)//从这个点去别的地方比从其他点去别的地方更短
dis[data.first] = data.second;
}
cout << sum << endl;
return 0;
}
最后
以上就是辛勤荷花为你收集整理的数据结构算法——1097. Hub Connection plan的全部内容,希望文章能够帮你解决数据结构算法——1097. Hub Connection plan所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复