我是靠谱客的博主 辛勤荷花,最近开发中收集的这篇文章主要介绍数据结构算法——1097. Hub Connection plan,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部