简单图论:旅行

这篇具有很好参考价值的文章主要介绍了简单图论:旅行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解题思路

最小生成树(Kruskal算法)

不同的的最小生成树:
不是连通的权重最小;
而是连通起始点和终点的路径上最大最小速度比值最小。

如何使得速度比值最小:
问题1:什么情况下比值最小?
( 1 、 3 、 5 、 4 、 2 ) ⇒ ( 1 、 2 、 3 、 4 、 5 ) (1、3、5、4、2) \Rightarrow (1、2、3、4、5) 13542(12345
问题2:直接基于Kruskal算法构建生成树,算该连通图中的最小比值是否可行?

步骤:
1、按Kruskal算法思路,按路径值排序;
2、从最短边开始基于并查集构建最小生成树;
3、添加边,当起始点和终点连通,计算速度比值;
4、从第二短边重新基于并查集构建最小生成树,重复第三步;
5、直到以所有边开始的最小生成树构建完成,输出比值。文章来源地址https://www.toymoban.com/news/detail-503227.html

AC_Code

# -*- coding: utf-8 -*-
# @Author : BYW-yuwei
# @Software: python3.8.6
from math import gcd
edges = []
def find(x):
    if x==father[x]:
        return x
    father[x] = find(father[x])
    return father[x]
n,m = map(int,input().split())
for i in range(m):
    x,y,u = list(map(int, input().split()))
    edges.append((x,y,u))
s,t = map(int,input().split())
edges.sort(key=lambda x:x[2])
minn = float('inf')
for i in range(m):
    father = [k for k in range(n+10)]
    flag = 0
    j = i
    for j in range(i,m):
        fx = find(edges[j][0])
        fy = find(edges[j][1])
        if fx<fy:
            father[fy]=fx
        else:
            father[fx]=fy
        if find(s)==find(t):
            flag=True
            break
    if flag:
        if edges[j][2]/edges[i][2]<minn:
            minn = edges[j][2]/edges[i][2]
            j1 = edges[j][2]
            j2 = edges[i][2]
if minn==float('inf'):
    print("IMPOSSIBLE")
else:
    if j1%j2==0:
        print(j1//j2)
    else:
        gcds = gcd(j1,j2)
        print('{}/{}'.format(j1//gcds,j2//gcds))


到了这里,关于简单图论:旅行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三章 图论 No.4最小生成树的简单应用

    存在边权为负的情况下,无法求最小生成树 裸题:1140. 最短网络 1140. 最短网络 - AcWing题库 套个prim的板子即可 裸题:1141. 局域网 1141. 局域网 - AcWing题库 裸题,稀疏图,套个kruskal的板子就行 需要注意的是:题目给定的图可能存在多个连通块,若使用prim算法,需要对每个连通

    2024年02月14日
    浏览(57)
  • 【深度优先搜索】【图论】【树】2646. 最小化旅行的价格总和

    【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 深度优先搜索 图论 树 现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在

    2024年02月19日
    浏览(40)
  • 简单图论:旅行

    最小生成树(Kruskal算法) 不同的的最小生成树: 不是连通的权重最小; 而是连通起始点和终点的路径上最大最小速度比值最小。 如何使得速度比值最小: 问题1:什么情况下比值最小? ( 1 、 3 、 5 、 4 、 2 ) ⇒ ( 1 、 2 、 3 、 4 、 5 ) (1、3、5、4、2) Rightarrow (1、2、

    2024年02月11日
    浏览(30)
  • Kruskal 算法 最小生成树

    1.按边从小到大进行排序 2.从小到大进行加边,保证加入的边的两端点不连通,即保证不形成回路

    2024年02月10日
    浏览(39)
  • 最小生成树——Kruskal算法

    目录 基本思想 实现 伪代码 实际问题求解 最小生成树 :带权连通图的生成树中 边的权值之和最小的生成树。 最小生成树不是唯一的。当图中的各边权值互不相等时,最小生成树是唯一的; 若无向连通图本身是一棵树时(边数比顶点数少1 ),则最小生成树就是它本身。 最

    2023年04月26日
    浏览(48)
  • 最小生成树——Kruskal算法详解

    1.Kruskal算法解决问题 :最小生成树 2.Kruskal所需要的前提知识: 边集数组(引用)和 结构体 3.Kruskal算法主要思想: Kruskal算法将 n 个点看成 n 个独立的连通分支。 首先按边权大小排序。 然后只要在 m 条边里按 下表从小到大遍历 选出 合适 的 n - 1 条(前提条件:选出的边不

    2024年02月03日
    浏览(42)
  • Kruskal算法求解最小生成树

    最小生成树是一个连通图。 什么是连通图,(强)连通图详解 前面介绍了《图存储结构》,本节继续讲解什么是 连通图 。 前面讲过,图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。例如图 1 中,虽然 V1 和 V3 http://c.biancheng.net/view/3405.ht

    2024年02月07日
    浏览(58)
  • 图的最小生成树-Kruskal算法

    目录 问题引入  程序设计  程序分析 本节文章 【问题描述】 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法。

    2024年02月08日
    浏览(58)
  • 859. Kruskal算法求最小生成树

    给定一个 nn 个点 mm 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出  impossible 。 给定一张边带权的无向图 G=(V,E)G=(V,E),其中 VV 表示图中点的集合,EE 表示图中边的集合,n=|V|n=|V|,m=|E|m=|E|。 由

    2023年04月09日
    浏览(39)
  • 最小生成树(Prim算法,Kruskal算法)

    (1)生成树: 如果在一个无向连通图不包含回路(连通图中不存在环),则为一个树 (2)最小生成树(minimal spanning tree): 在一个图所有生成树中,代价最小的生成树称为最小生成树 (3)生成树的代价: 在一个无向连通网中,生成树各边的权值之和称为该生成树的代价

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包