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> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
随机推荐
- 对Web(Springboot + Vue)实现文件下载功能的改进
此为 软件开发与创新 课程的作业 对已有项目(非本人)阅读分析 找出软件尚存缺陷 改进其软件做二次开发 整理成一份博客 原项目简介 本篇博客所分析的项目来自于 ジ绯色月下ぎ--vue+axios+sp ...
- Centos7 安装 redis4.x
一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxd ...
- DQL,DML,DDL,DCL分别是什么?
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句 ...
- JavaWeb之分页查询
时间:2016-12-11 01:41 1.分页的优点: 只查询一页,不需要查询所有数据,能够提高效率.2.分页数据 页面的数据都是由Servlet传递的 * 当前页:pageC ...
- vue3.0入门(五):vite构建vue项目
使用vite构建项目步骤 安装node,cmd输入:node -v验证是否安装成功:一般node安装后会自动安装npm,cmd输入:npm -v验证是否安装成功 选择一个文件夹作为项目文件夹,搜索框输 ...
- Kickstart部署之NFS架构
原文转自:https://www.cnblogs.com/itzgr/p/10200615.html作者:木二 目录 一 准备 1.1 完整架构:Kickstart+DHCP+NFS+TFTP+PXE ...
- 一键备份公众号的所有文章到PDF,再也不用担心想看的文章被删了
有的时候,我们会发现收藏的某个微信公众号文章会被删或者和谐了,尤其是对自己非常实用的文章,一定会后悔当初怎么没有复制或者备份下来. 单篇的公众号文章要备份,随便百度一下就能找到非常多方法,这里就不多废 ...
- Nginx+Tomcat+Memcached实现session共享
实验环境: server1:nginx tomcat memcached server2:tomcat memcached Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入 ...
- .NET 5 支持 Azure Functions OpenAPI 扩展啦
今年5月,在 Build大会上,Azure FunctionsOpenAPI的功能支持(预览版)正式宣布. 当时,它最高支持 v3 运行时--.NET Core 3.1 版本. 最近,它发布了 .NE ...
- Linux常用命令 - less命令详解
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 查看文 ...