朱 - 刘算法

· 定义

  对于有向无环图G (V, E),类似最小生成树的定义,有向图最小树形图即在有向图上查找总权值和最小的树形图(即有向边的树)。

· 朱 - 刘算法

  对于每个点先选取到达它的最小的边,这样可组成一个边集E1,显然,该边集权值和最小,但不一定是树。

  在该边集上进行缩点,并判断是否有解(是否有点无入度),在融会G中,记为G1

  当然,若此时没有找到有向环且有解,说明在当前图上已找到最小树形图,那么将原来的缩点解开,即除了当前树形图上的弧之外,将缩点内没有与已知弧有相同终点的边选出,如此构成了G的最小树形图。

  反之,则进行改边:先省去缩点内边;对于由缩点内出去的边,保持原权值即可;对于进入缩点的边,令Vs表示缩点点集,对于∀v ∈ Vs,∀u ∉ Vs,有<u, V> = <u, v> - v的最小入权边,是因为这样将权值相加的话,就相当于删去了缩点中拥有相同终点的边。

  这样更改完点集与边集,进行重复运算即可。

  其中,复杂度O (nm)。

· 代码

  (改代码仅求最小权值总和,这样是不需解开缩点的)

  

原文地址:https://www.cnblogs.com/Colythme/p/9710789.html

时间: 2024-11-01 13:06:56

朱 - 刘算法的相关文章

hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 题目意思大概是要你在一些城市中选一个做首都 , 要求首都都能到其他城市 , 道路花费要最少 , 且道路都是单向的 , 这个时候就要用到最小树形图算法了 , 而且是不固定根. 不定根就是加一个虚根(原本不存在的点) , 可以让这个虚根到每个点的距离大于原本所有点连接的道路花费之和sum , 然后计算出的结果减去sum,如果比sum还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通

UVA-11865 Stream My Contest (朱-刘 算法+二分)

题目大意:有一张n个顶点,m条边的有向图,根节点为0.每条边有两个权值,一个是费用c,一个是长度b.问在总费用不超过cost的情况下选出若干条边,使得n个点连通时的边的最短长度的最大值是多少. 题目分析:如果已知这个最短距离的最大值d,则问题就变成了:用长度不小于d的边能否构成一个总权值不大于cost的最小树形图.因此,二分枚举d,用朱-刘 算法判断即可. 代码如下: # include<iostream> # include<cstdio> # include<vector

【朱-刘算法】【最小树形图】hdu6141 I am your Father!

题意:给你一张带权有向图,让你求最大树形图.并在此前提下令n号结点父亲的编号最小. 比赛的时候套了个二分,TLE了. 实际上可以给每个边的权值乘1000,对于n号结点的父边,加上(999-父结点编号)大小的权值,这样即可保证最大树形图的前提下,n号结点父亲的编号最小. 网上找了个朱-刘算法的板子,把边权取负就能跑最大树形图了. #include <cstdio> #include <string> #include <cstring> #define MAXN 1005

AIZU AOJ 2309 Vector Compression 最小树形图(朱—刘算法)

题意简述:给定若干个相同维度的向量,寻找一种排序方法,使得所有向量的表示长度总和最低. 所谓表示长度为(Aj-r*Ai)^2,其中i<j  数据范围:向量总数和维度均小于100 思路:(1)首先Ai和Aj确定后,最小表示长度是可以在线性时间计算出来的.使用简单的二次函数分析方法即可. (2)上述可以得出任意两向量之间的距离,即为图中的边,于是问题可以转化为有向图的"最小树形图",i到j的有向边权值即为用Aj表示Ai的最小表示长度. (3)朱-刘算法简述: 首先对除根以外的点选择一

UVa11183 Teen Girl Squad, 最小树形图,朱刘算法

Teen Girl Squad Input: Standard Input Output: Standard Output You are part of a group of n teenage girls armed with cellphones. You have some news you want to tell everyone in the group. The problem is that no two of you are in the same room, and you

POJ--3164--Command Network【朱刘算法】最小树形图

链接:http://poj.org/problem?id=3164 题意:告诉n个点坐标,m条边表示两个点之间有路.从1点開始建立一个有向图最小生成树. 朱刘算法模板题 ========================== 切割线之下摘自user_id=Sasuke_SCUT" style="color:rgb(202,0,0); text-decoration:none; font-family:Arial; font-size:14px; line-height:26px"

POJ - 3164 Command Network(朱刘算法)

题目大意:有N个点,M条有向边.现在要求你以1为根,构造出一棵最小生成树,问这棵最小生成树能否被构造出来,如果可以,总权值是多少 解题思路:朱刘算法的裸题,我只想吐槽一下POJ,用的是double型的,输出时是%.2lf,结果是WA 换成了%.2f就A了..这什么情况,白白花费了1个多小时去调错.. #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define N 1

HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)

题目大意:给你N个点,M条有向边,问以哪个点为根结点时,能使最小生成树总权值达到最小,输出总权值和根. 如果构不成最小生成树,另外输出 解题思路:这题很巧妙,暴力枚举的话,肯定TLE,所以,这题就需要点技巧了 可以设一个虚根,虚根连接每一个点,权值为所有边的总权值+1.接着,以虚根为根,跑朱刘算法. 跑出结果后,要判断一下,如果最小生成树的总权值比2 * (所有边的总权值+1)还要大,表示虚根至少和两个点相连了,这样最小生成树就是棵假的最小生成树了,因为至少有两个点入度为0了 得到结果时要怎么找

poj 3164 最小树形图(朱刘算法)

朱刘算法模板题 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define INF 1<<30 using namespace std; int n,m; struct node { double x,y; }nod[110<<1]; double in[110<<1

POJ3164 Command Network【最小树形图】【朱刘算法】

Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 13398 Accepted: 3868 Description After a long lasting war on words, a war on arms finally breaks out between littleken's and KnuthOcean's kingdoms. A sudden and violent assau