P4716-[模板]最小树形图
正题
题目链接:https://www.luogu.com.cn/problem/P4716
题目大意
给出\(n\)个点\(m\)条边的一张有向图,求以\(r\)为根的最小外向树。
\(1\leq n\leq 100,1\leq m\leq 10^4\)
解题思路
考虑一种贪心,对于每个点我们先选出一个连入的最小的边权,但是这样可能产生环。
考虑暴力将环去掉,我们枚举所有的环,然后将环缩成一个点,之后然后每个环外的边都减去入点所连接边的权值(可撤销贪心)。
然后问题规模就缩小了,不断重复上述过程即可。
时间复杂度\(O(n(n+m))\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
struct node{
int x,y,w;
}e[N*N];
int n,m,r,h[N],pre[N],v[N],id[N],ans;
int main()
{
scanf("%d%d%d",&n,&m,&r);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
while(1){
memset(h,0x3f,sizeof(h));
memset(v,0,sizeof(v));
memset(id,0,sizeof(id));
for(int i=1;i<=m;i++)
if(e[i].x!=e[i].y&&e[i].w<h[e[i].y])
h[e[i].y]=e[i].w,pre[e[i].y]=e[i].x;
for(int i=1;i<=n;i++)
if(i!=r&&h[i]==h[0])return puts("-1")&0;
int cnt=0;
for(int p=1;p<=n;p++){
if(p==r)continue;
int x=p;ans+=h[x];
while(x!=r&&v[x]!=p&&!id[x])v[x]=p,x=pre[x];
if(x!=r&&!id[x]){
id[x]=++cnt;
for(int y=pre[x];y!=x;y=pre[y])id[y]=cnt;
}
}
if(cnt==0)break;
for(int i=1;i<=n;i++)
if(!id[i])id[i]=++cnt;
for(int i=1;i<=m;i++){
e[i].w-=h[e[i].y];
e[i].x=id[e[i].x];
e[i].y=id[e[i].y];
}
r=id[r];n=cnt;
}
printf("%d\n",ans);
return 0;
}
P4716-[模板]最小树形图的更多相关文章
- 【刷题】洛谷 P4716 【模板】最小树形图
题目背景 这是一道模板题. 题目描述 给定包含 \(n\) 个结点, \(m\) 条有向边的一个图.试求一棵以结点 \(r\) 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 \(r\ ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)
题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...
- poj 3164(最小树形图模板)
题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- poj 3164 最小树形图模板!!!
/* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...
- poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
随机推荐
- C# prism 框架 MVVM框架 Prism系列之事件聚合器
网址:https://www.cnblogs.com/ryzen/p/12610249.html 本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 ...
- 遇到的C++ cli 转 C++ native 为C# 程序提供接口。
接口文件 /*++ (do not edit the above line) ************************************************************* ...
- NameNode&Secondary NameNode 工作机制
NameNode&Secondary NameNode 工作机制 NameNode: 1.启动时,加载编辑日志和镜像文件到内存 2.当客户端对元数据进行增删改,请求NameNode 3.Nam ...
- 关于Ubuntu18.04 linux系统下使用Tim QQ 微信
先配上张图 步骤: 1.1 :需要安装环境deepin-wine 1.1:(你把他理解为jdk就好,没有jdk无法运行java程序,同理没有deepin-wine环境无法运行腾讯产品) 1.2 :去哪 ...
- vue-bluJavascript - Vue - 插件(swiper、vue-preview)
swiper swiper是一个支持滑动效果的js插件,它也支持在vue中使用,主要用于移动端的触摸滑动操作.Swiper中文网. 安装和导入插件 npm i vue-awesome-swiper - ...
- 我对数据库事务的理解(MYSQL中)
-- 设置数据库事务为手动的提交SET @@AUTOCOMMIT = 0;-- 查看是否被修改SELECT @@autocommit;-- 查看当前的编码格式SELECT @@character_se ...
- 二进制I/O
1 import java.io.BufferedInputStream; 2 import java.io.BufferedOutputStream; 3 import java.io.DataIn ...
- Promise.all()
语法:Promise.all(iterable); 参数:iterable 一个可迭代对象,如 Array 或 String. 返回值:如果传入的参数是一个空的可迭代对象,则返回一个已完成(alrea ...
- Learning ROS: Roslaunch tips for large projects
Design tip: Top-level launch files should be short, and consist of include's to other files correspo ...
- Linux常用命令(一)之文件处理命令
分时的多用户.多任务的操作系统 多数的网络协议的支持(unix和tcp/ip协议是同时发展起来的),方便的远程管理(可以通过图形.命令行) 强大的内存管理和文件管理系统 大量的可用软件和免费软件(游戏 ...