Codevs 1231 最优布线问题

本文介绍了一种基于最小生成树算法解决计算机网络连接问题的方法。具体地,文章提供了一个具体的编程实现案例,该案例旨在寻找一种最优策略,使得任意两台计算机间能够以最低的总成本实现连通。

题目描述 Description
学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的。为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接。

为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用。

输入描述 Input Description
输入第一行为两个整数n,m(2<=n<=100000,2<=m<=100000),表示计算机总数,和可以互相建立连接的连接个数。接下来m行,每行三个整数a,b,c 表示在机器a和机器b之间建立连接的话费是c。(题目保证一定存在可行的连通方案, 数据中可能存在权值不一样的重边,但是保证没有自环)

输出描述 Output Description
输出只有一行一个整数,表示最省的总连接费用。

样例输入 Sample Input
3 3

1 2 1

1 3 2

2 3 1

样例输出 Sample Output
2

数据范围及提示 Data Size & Hint
最终答案需要用long long类型来保存重点内容

题意:连接所有城市,求最小费用  
// 最小生成树裸题
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int size=200001;

LL n,m;
LL fa[size];
LL ans=0; 

struct node{
    LL f,t,c;
}e[size];

bool cmp(node a,node b)
{
    return a.c<b.c;
}

LL find(LL x)
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}

void kru()
{
    sort(e+1,e+m+1,cmp);

    for(int i=1;i<=m;i++)
    {
        LL fx=find(e[i].f),fy=find(e[i].t); 
        if(fx!=fy) 
        {
            fa[fx]=fy;
            ans+=e[i].c;
        }
    }
    printf("%lld\n",ans);
}

int main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld",&e[i].f,&e[i].t,&e[i].c);
    }

    for(int i=1;i<=n;i++)
    fa[i]=i;

    kru();

    return 0;
}

不是最短路,who know 哪两台电脑之间的“路”最短,都算一遍?大清早发疯想这个问题……

### Floyd算法在最线问题中的实现与应用 #### 1. Floyd算法的核心思想 Floyd-Warshall算法是一种经典的动态规划方法,适用于求解加权有向图中所有节点对之间的最短路径问题[^3]。该算法通过引入中间节点的概念,逐步化每一对节点间的路径长度。 #### 2. 最线问题的定义 在网络设计领域,“最线问题”通常指的是在一个网络拓扑结构中找到连接多个设备的最佳路径集合,使得总成本最低或者延迟最小。这种场景可以建模为带权重的图结构,其中节点代表设备或交换机,边上的权重表示两台设备间通信的成本、延时或其他性能指标[^1]。 #### 3. 使用Floyd算法解决最线问题的具体步骤 以下是利用Floyd-Warshall算法处理此类问题的一般流程: - **初始化阶段**: 构造初始的距离矩阵 `D` ,大小为 n×n (假设共有 n 台设备),对于不存在直接链路的情况赋予极大值 ∞ 。如果 i 和 j 存在直连,则设置 D[i][j]=w(i,j), w 表示对应链路上的代价函数;另外规定自环 d[i][i]=0。 - **迭代更新过程**: 对于每一个可能充当中介的角色 k (即第 k 层循环),遍历所有的起点 u 和终点 v 组合,尝试经由当前考虑的中介点 k 是否能够缩短已知从 u 到达 v 的路程。具体操作如下所示: ```python for k in range(n): for i in range(n): for j in range(n): if dist[i][k] + dist[k][j] < dist[i][j]: dist[i][j] = dist[i][k] + dist[k][j] ``` - **结果分析**: 完成上述嵌套三层for-loop之后,最终得到的新版距离表就记录下了任意两点之间理论上可行且经济实惠的传输线路方案[^2]。 #### 4. 应用实例——数据中心内部服务器互联化 设想某大型互联网公司正在扩建其位于不同城市的几个超大规模云计算中心内的物理基础设施建设工作。为了提高整体效率并降低成本支出,工程师们决定采用基于Floyd-Warshall算法的方法论来重新审视现有的光纤铺设策略。他们先收集到各个楼层配线架位置以及预估安装费用等相关参数作为输入条件交给程序运算得出最佳组合形式后再付诸实施行动之中去验证效果如何。 #### 5. 注意事项 尽管如此强大的工具可以帮助我们快速获得全局视野下的解决方案建议,但是也需要注意一些潜在缺陷比如当面对特别庞大的系统规模时候可能会因为内存占用过高而导致无法正常完成整个计算周期等问题发生所以要谨慎对待实际项目开发过程中遇到的各种特殊情况才行哦! ```python def floyd_warshall(graph): V = len(graph) distance = [[float('inf')] * V for _ in range(V)] # Initialize the graph distances. for i in range(V): for j in range(V): if i == j: distance[i][j] = 0 elif graph[i][j] != float('inf'): distance[i][j] = graph[i][j] # Apply dynamic programming to find all pairs shortest paths. for k in range(V): for i in range(V): for j in range(V): if distance[i][k] + distance[k][j] < distance[i][j]: distance[i][j] = distance[i][k] + distance[k][j] return distance ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值