美文网首页
管道网络

管道网络

作者: loick | 来源:发表于2019-11-28 13:04 被阅读0次

Description

Every house in the colony has at most one pipe going into it and at most one pipe going out of it. Tanks and taps are to be installed in a manner such that every house with one outgoing pipe but no incoming pipe gets a tank installed on its roof and every house with only an incoming pipe and no outgoing pipe gets a tap. Find the efficient way for the construction of the network of pipes.

Input

The first line contains an integer T denoting the number of test cases. For each test case, the first line contains two integer n & p denoting the number of houses and number of pipes respectively. Next, p lines contain 3 integer inputs a, b & d, d denoting the diameter of the pipe from the house a to house b.Constraints:1<=T<=50,1<=n<=20,1<=p<=50,1<=a, b<=20,1<=d<=100

Output

For each test case, the output is the number of pairs of tanks and taps installed i.e n followed by n lines that contain three integers: house number of tank, house number of tap and the minimum diameter of pipe between them.

Sample Input 1
1
9 6
7 4 98
5 9 72
4 6 10
2 8 22
9 7 17
3 1 66
Sample Output 1
3
2 8 22
3 1 66
5 6 10

思路

题目不好理解,画个图就好明白了


把上面的输入输出用例画出来就是水管的连接图,箭头连接的是不同的人家,箭头上面的数字是水管的直径,我们需要在没有输入水管的人家安装tank,在没有输出的人家安装tap,所以需要安装的是5 -> 6, 2 -> 8, 3 -> 1,至于安装在它们之间的最小水管大小,就是连通路径上的最小水管直径。比如5 -> 6连通路径上最小的直径是10,因此最后结果就是10。

解题思路:

  1. 找到所有的起点(5, 2, 3)

    可以先记录所有路径的起点,和终点,最后用起点减去终点,就能找到所有真实的起点。

  2. 从起点开始,找出下一条路径,直到没有下一条路径结束,记录结束的点(与上面对应的是6, 8, 1)

    记录从起点到终点的路径中,需要记录管道直径的最小值,最后输出

python O(N)
def solve(p, pairs):
    link, vals = {}, {}
    for pair in pairs:
        link[pair[0]] = pair[1]
        vals[(pair[0], pair[1])] = pair[2]
    starts = set(link.keys()) - set(link.values())

    ans = []
    for s in starts:
        e = link[s]
        val = vals[(s, e)]
        while e in link:
            val = min(val, vals[e, link[e]])
            e = link[e]
        ans.append((s, e, val))

    return sorted(ans)


for _ in range(int(input())):
    p, t = map(int, input().strip().split())
    pairs = [tuple(map(int, input().strip().split())) for _ in range(t)]
    res = solve(p, pairs)
    print(len(res))
    for ans in res:
        print(*ans)

相关文章

  • 进程间通信

    声明:图片资源摘自于网络 管道(PIPE) 有名管道(FIFO) 进程1 进程2 高级管道(popen) 共享内存...

  • 管道网络

    Description Every house in the colony has at most one pip...

  • windows安全初探之命名管道

    前言: 最近学校开了操作系统这门课,记录自己学习命名管道中与网络安全有关的内容。 关于命名管道: “命名管道”又名...

  • 管道的故事为什么可以改变数亿人的命运!

    前两天我们一起说了说管道的故事,管道的力量。但是在从事这个网络营销生意中,光有管道是远远不够的,你还需要一个系统!...

  • 教育

    网络&操作系统 1.进程通信的方式有哪些,linux中管道的底层原理 管道、消息队列、共享内存、信号量、信号、so...

  • 【深入浅出Linux】Linux管道命令踩坑实录

    前言 看这个问题前我们要先明白什么是管道。 管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络...

  • socket编程简述

    它是基于TCP/IP协议,socket就是一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A端扔进去...

  • linux 常用命令

    2 Linux 命令 磁盘管理,文件管理,系统设置,解压缩,网络通讯,网络访问,权限管理,管道和重定向,vi编辑命...

  • Unlabeled Samples Generated by G

    通过对抗生成网络产生无标签样本在此之外提高行人重识别的基准摘要:这篇论文的主要贡献是简单的半监督管道,这个管道仅仅...

  • windows 匿名管道

    1、匿名管道是进程间通信的一种技术。windows提供的匿名管道技术,不能够跨网络跨机器,只能在同一机器上不同进程...

网友评论

      本文标题:管道网络

      本文链接:https://www.haomeiwen.com/subject/toxbwctx.html