数据结构算法——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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值