洛谷 1546 最短网络

题目描述:

        约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000


输入格式:
       第一行: 农场的个数,N(3<=N<=100)。第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

输出格式:
        只有一个输出,其中包含连接到每个农场的光纤的最小长度。

输入样例#1:
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
输出样例#1:

28


解题思路:

        最小生成树


代码:

type
  node=record
        fromv,endv:longint;
        w:longint;
end;


var
  t:node;
  s,m,min,i,j,k,ans,n:longint;
  elist:array[1..100000]of node;
  a:array[1..500,1..500]of longint;


begin
  readln(n);
  fillchar(a,sizeof(a),$7f);
  for i:=1 to n do
    for j:=1 to n do
      read(a[i,j]);
  for i:=1 to n-1 do
    begin
      elist[i].fromv:=1;elist[i].endv:=i+1;elist[i].w:=a[1,i+1];
    end;
  for k:=1 to n-1 do
    begin
      min:=maxlongint;m:=k;
      for j:=k to n-1 do
        if elist[j].w<min then begin min:=elist[j].w;m:=j;end;
      if m<>k then begin t:=elist[k];elist[k]:=elist[m];elist[m]:=t;end;
      j:=elist[k].endv;
      for i:=k+1 to n-1 do
        begin
          s:=elist[i].endv;
          if a[j,s]<elist[i].w then
            begin
              elist[i].w:=a[j,s];
              elist[i].fromv:=j;
            end;
        end;
    end;
  ans:=0;
  for i:=1 to n-1 do
    ans:=ans+elist[i].w;
  writeln(ans);
end.

     

### 洛谷图论题目合集与学习资源 洛谷作为一个知名的在线编程学习平台,提供了大量的图论相关题目和学习资源。以下是关于洛谷图论题目合集及学习资料的详细介绍: #### 1. 图论基础题目集合 洛谷平台上包含了许多经典的图论题目,涵盖了拓扑排序、DFS、BFS、Floyd、Dijkstra、LCA(近公共祖先)、小生成树、路径等内容。以下是一些推荐的基础图论题目集合[^1]: - **P3386 【模板】二分图大匹配**:此题为二分图大匹配的经典模板题,适合初学者练习匈牙利算法或网络流算法。 - **P3372 【模板】Kruskal 算法小生成树**:通过此题可以熟悉 Kruskal 算法实现小生成树的过程。 - **P3373 【模板】Prim 算法小生成树**:Prim 算法是另一种小生成树的方法,此题为其实现提供了一个良好的实践机会。 #### 2. 并查集相关题目 并查集是一种用于处理集合合并与查询问题的数据结构,在图论中有着广泛的应用。以下是一些与并查集相关的题目[^2]: - **P5836 [USACO19DEC]Milk Visits S【并查集】**:此题需要使用并查集来判断奶牛之间的连通性,并根据条件进行合并操作。 - **P2820 局域网【并查集 + 小生成树】**:结合了并查集和小生成树的知识点,要计算局域网中的优连接方式。 #### 3. 高级图论题目 对于已经掌握基础图论知识的学习者,可以尝试以下高级题目集合[^3]: - **P3629 [APIO2010]巡逻【树的直径】**:此题涉及树的直径计算,是一个经典的树形图论问题。 - **P4568 [JLOI2011]飞行路线【多源路径】**:此题需要使用 Floyd-Warshall 算法或其他多源路径算法来解决复杂图中的路径问题。 #### 4. 学习资源推荐 除了题目练习外,洛谷还提供了丰富的学习资料,帮助用户深入理解图论知识[^4]: - **洛谷题解区**:每道题目下方都有详细的题解,涵盖多种解法和优化技巧。 - **优快云 博客**:许多博主在 优快云 上分享了关于图论的学习笔记和经典题目解析,例如《图》经典题题解(拓扑排序,DFS,BFS,Floyd, Dijkstra, LCA 近公共祖先,小生成树,路径)。 - **OI Wiki**:这是一个开源的竞赛编程学习网站,其中包含了图论相关的理论知识和算法实现。 ```python # 示例代码:Kruskal 算法小生成树 def find(x, f): if f[x] == x: return x f[x] = find(f[x], f) return f[x] def kruskal(n, edges): edges.sort(key=lambda x: x[2]) f = list(range(n + 1)) mst = [] for u, v, w in edges: root_u = find(u, f) root_v = find(v, f) if root_u != root_v: f[root_u] = root_v mst.append((u, v, w)) return mst ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值