题意

说一下我对朱刘算法的理解:

首先我们考虑树形图的性质:每个点除了根节以外都含有一条入边。

因此我们可以有一个贪心的想法:对每个点(除了根节点)找到一条最短的入边,但是这样会出现环,如下图:



我们会找到\(2-3-4\)这个环。

根据贪心的思想,我们最终的答案必定含有这个环去掉一条边,于是我们将这三个点缩成一个点,加上这三条边的答案,并且修改所有连向这三个点的边的边权。

举个例子:

原来有条边\(1->4\),边权为\(4\),连向\(4\)的最小边权为\(2\),我们已经加上了\(2\),因此如果再选\(1->4\),那么应该再加上\(4-2=2\),于是这条边的边权改为\(2\)。

我们不断迭代,复杂度为\(O(nm)\)。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=110;
const int maxm=1e4+10;
const int inf=1e9;
int n,m,root;
int fa[maxn],pre[maxn],mindis[maxn],col[maxn];
struct Edge{int u,v,w;}E[maxm];
inline ll solve()
{
ll res=0;
while(2333)
{
int cnt=0;
for(int i=1;i<=n;i++)fa[i]=pre[i]=col[i]=0,mindis[i]=inf;
for(int i=1;i<=m;i++)
if(E[i].u!=E[i].v&&mindis[E[i].v]>E[i].w)
pre[E[i].v]=E[i].u,mindis[E[i].v]=E[i].w;
mindis[root]=0;
for(int i=1;i<=n;i++)
{
if(mindis[i]==inf)return -1;
res+=mindis[i];
int x=i;
while(x!=root&&fa[x]!=i&&!col[x])fa[x]=i,x=pre[x];
if(x!=root&&!col[x])
{
col[x]=++cnt;
int y=pre[x];
while(y!=x)col[y]=cnt,y=pre[y];
}
}
if(!cnt)return res;
for(int i=1;i<=n;i++)if(!col[i])col[i]=++cnt;
for(int i=1;i<=m;i++)
{
int delta=mindis[E[i].v];
E[i].u=col[E[i].u],E[i].v=col[E[i].v];
if(E[i].u!=E[i].v)E[i].w-=delta;
}
n=cnt;root=col[root];
}
return 233;
}
int main()
{
scanf("%d%d%d",&n,&m,&root);
for(int i=1;i<=m;i++)scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
printf("%lld",solve());
return 0;
}

P4716 【模板】最小树形图的更多相关文章

  1. 【刷题】洛谷 P4716 【模板】最小树形图

    题目背景 这是一道模板题. 题目描述 给定包含 \(n\) 个结点, \(m\) 条有向边的一个图.试求一棵以结点 \(r\) 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 \(r\ ...

  2. POJ 3164 Command Network 最小树形图模板

    最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...

  3. HDU 2121 Ice_cream’s world II 最小树形图 模板

    开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  4. POJ 3164 Command Network(最小树形图模板题+详解)

    http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...

  5. UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)

    题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...

  6. poj 3164(最小树形图模板)

    题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...

  7. poj3164(最小树形图&朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  8. poj 3164 最小树形图模板!!!

    /* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...

  9. poj3164最小树形图模板题

    题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...

  10. hdu 4009 最小树形图模板题朱刘算法

    #include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...

随机推荐

  1. 【2】通过Ajax方式上传文件(图片),使用FormData进行Ajax请求

    HTML: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...

  2. 安装golang web框架 gin

    gin 地址https://github.com/gin-gonic/gin#installation 去gin 地址 clone 下来,放到对应的包中即可.如:gin就放在项目文件夹/github. ...

  3. Spring获取request、session以及servletContext

    获取request: HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestA ...

  4. c++ 调用 sqlite

    #include <iostream> #include "sqlite3.h" using namespace std; void dbTest() { #pragm ...

  5. ascx

    aspx是页面文件ascx是用户控件,用户控件必须嵌入到aspx中才能使用. ascx是用户控件,相当于模板 其实ascx你可以理解为Html里的一部分代码,只是嵌到aspx里而已,因为aspx内容多 ...

  6. mysql(5.6及以下)解析json

    转自:https://blog.csdn.net/weixin_33979203/article/details/87621768 #json解析函数 DELIMITER $$ DROP FUNCTI ...

  7. RouteReuseStrategy angular路由复用策略详解,深度刨析路由复用策略

    关于前端路由复用策略网上的文章很多,大多是讲如何实现tab标签切换历史数据,至于如何复用的原理讲的都比较朦胧,代码样例也很难适用各种各样的路由配置,比如懒加载模式下多级嵌套路由出口网上的大部分代码都会 ...

  8. WNMP环境搭建步骤 nginx1.4.3+php-5.3.27+mysql-5.5+RunHiddenConsole

    安装目录:D:/webServer/所需软件:     mysql-installer-community-5.5.34.0.msi         下载:http://cdn.mysql.com/D ...

  9. 发布一本用 GitBook 编辑的书

    在上一篇的文章里,我们已经写好了一本名叫 erdong-first-book 的书,但是在本地浏览很不方便,我们希望放到网络上,可以随时.方便的访问这个书籍.这个需求可以使用多种方式来实现,比如第一种 ...

  10. activemq高可用

    这里是基于 zookeeper 选举方式实现的集群配置,服务器过半数才可提供服务,所以是2n+1台这里以三台为例. 只有master节点能提供服务,slave节点无法提供服务,只有当master节点挂 ...