hdu2121 朱刘算法不定根
hdu4009也可以做一下,据说是模板题,我愣是没看出来,从hdu4009才晓得加虚根,但这个题又懵逼了,不知道咋处理,加虚根也不会处理啊,对算法的理解还是不够。
题解:
1:加虚根root=0,从虚根向1-n的点都连接一个边权为sum的边。
2:sum=样例中所有边的权值和+1,不懂就继续往下看。
3:如果我们从虚根出发形成的最小树形图的值为ans。如果ans-sum>=sum,说明root=0到各个点的边至少被用了两条。这就说明原图不联通。联通的话应该是ans-sum<sum。这个时候输出ans-sum就是了。
4:那么怎样输出最小的真正根呢?
5:我在代码里标出来了,就是朱刘算法模板中的if(u==root) pos=i;
6:因为这个边的起点是u==root,所以i边是我们加上去的边。如果有多个最小树形图的话,几个真正的根一定是在环SSS上,不相信可以画图试试,用反证法可证明。我们在找到环的时候是进行了缩点操作,点的序号是变化的。但是边的序号是不变的,所以我们从变得序号下手。m+1表示的是root->1的边,m+2表示的是root->2的边。我们枚举1-(n+m)的边,因为(m+1)-(n+m)的边的权值都是一样的。环SSS被缩成点了,但是(m+1)-(n+m)边中最先枚举到的到的,一定是最小的。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1e17
#define type ll
const int maxn1=1e3+5;
const int maxn2=2e4+5;
struct edge{int u,v;type cost;
}e[maxn2];
int pre[maxn1],id[maxn1],vis[maxn1],pos;
type in[maxn1];
int n,m;
type Directed_MST(int root,int n,int m){//处理的是0到n-1的点 处理的是1到m的点 type ret = 0;while(true) {//1.找最小入边for(int i=0;i<n;i++) in[i] = inf;for(int i=1;i<=m;i++){int u=e[i].u;int v=e[i].v;if(e[i].cost<in[v]&&u!=v) {pre[v]=u;in[v]=e[i].cost;if(u==root){pos=i; //******记录下虚根到某个节点的边,输出是pos-m-1。其他的就是朱刘算法的模板}}}for(int i=0;i<n;i++){if(i==root) continue;if(in[i]==inf) return -1;//除了跟以外有点没有入边,则根无法到达它}//2.找环int cntnode=0;memset(id,-1,sizeof(id));memset(vis,-1,sizeof(vis));in[root] = 0;for(int i=0;i<n;i++){//标记每个环ret+=in[i];int v=i;while(vis[v]!=i&&id[v]==-1&&v!=root) {vis[v] = i;v = pre[v];}if(v!=root&&id[v]==-1) {for(int u=pre[v];u!=v;u=pre[u]) {id[u]=cntnode;}id[v]=cntnode ++;}}if(cntnode==0) break;//无环for(int i=0;i<n;i++) if(id[i]==-1){id[i]=cntnode++;}//3.缩点,重新标记for(int i=1;i<=m;i++){int v=e[i].v;e[i].u=id[e[i].u];e[i].v=id[e[i].v];if(e[i].u!=e[i].v) {e[i].cost-=in[v];}}n=cntnode;root=id[root];}return ret;
}int main()
{int n,m,root;while(~scanf("%d%d",&n,&m)){type sum=0;for(int i=1;i<=m;i++){scanf("%d%d%lld",&e[i].u,&e[i].v,&e[i].cost);e[i].u++; e[i].v++;sum+=e[i].cost;}sum++;root=0;for(int i=1,j=m+1;i<=n;i++,j++){e[j].u=0; e[j].v=i;e[j].cost=sum;}type ans=Directed_MST(root,n+1,m+n);if(-1==ans||ans-sum>=sum) printf("impossible\n\n");else printf("%lld %d\n\n",ans-sum,pos-m-1);}return 0;
}
hdu2121 朱刘算法不定根相关推荐
- 【朱-刘算法】【最小树形图】hdu6141 I am your Father!
题意:给你一张带权有向图,让你求最大树形图.并在此前提下令n号结点父亲的编号最小. 比赛的时候套了个二分,TLE了. 实际上可以给每个边的权值乘1000,对于n号结点的父边,加上(999-父结点编号) ...
- poj3164(最小树形图朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- [UVA - 11865]Stream My Contest(最小树形图+朱刘算法)
本题过于简单,朱刘算法模板题,考虑二分一下带宽即可 title code title code #include <cstdio> #include <cstring> #in ...
- [POJ 3164]Command Network(最小树形图,朱刘算法)
文章目录 title solution code title solution 读完翻译后,很明显就是个朱刘算法的板子题 最小树形图,就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 ...
- NOIP模拟题 通讯 强连通分量缩点 最小树形图--朱刘算法
通讯 (message.cpp\c\pas) [问题描述] "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦 ...
- HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)
题目大意:给你N个点,M条有向边,问以哪个点为根结点时,能使最小生成树总权值达到最小,输出总权值和根. 如果构不成最小生成树,另外输出 解题思路:这题很巧妙,暴力枚举的话,肯定TLE,所以,这题就需要 ...
- 最小树形图 之 朱刘算法【模板】
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...
- 朱刘算法 有向图的最小生成树
朱刘算法 有向图的类Prim算法,找有向图的最小生成树 最小树形图 树形图: 无有向环 除了根节点外,每个点入度为1 以某个点为根的一棵有向树,其边权之和为图中所有树形图中是最小的称为最小树形图. 朱 ...
- 朱刘算法(最小树形图)
P4716 [模板]最小树形图 题目 题目描述 给定包含 nn 个结点, mm 条有向边的一个图.试求一棵以结点 rr 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 rr 为根的最小 ...
最新文章
- CV_CAST_8U(val);的意义
- spring @order控制对象的顺序
- 2018 Wannafly summer camp Day3--Knight
- CentOS7安装ipython
- KTH 皇家理工学院 计算机视觉和机器学习博士生 招生
- 类名引用static变量好处
- pytorch之过拟合的处理(Dropout)(笔记五)
- 引用axiv文献的问题
- java中map类型_Java中Map类型遍历的两种方式对比
- 广芯微电子产品使用笔记分享
- idea代码格式化详细总结(快捷键、格式化规则、格式化模板)
- matlab图像分割(肺实质)
- 防火墙与路由器的区别
- 姿态估计1-10:FSA-Net(头部姿态估算)-源码无死角讲解(5)-Feature aggregation
- js实现页面视频监控全屏
- 拉丁超立方——样本点空间转换
- Mac装机必备软件2020最全下载集合
- spring中<tx:annotation-driven>标签转为注解@EnableTransactionManagement
- 最新抖音简单无人直播教程
- 论文参考文献格式说明
热门文章
- Ubuntu 14.04+GT720M+CUDA8.0+CUDNN+PYCAFFE
- 数字图像处理(DIP)实验4 目标颜色识别
- Linux系统之LVM(逻辑卷管理)
- Python求解多个多元一次方程组(完整可运行版本代码)
- COVID-19 Cases Prediction (Regression)
- Google Pay支付遇到的问题
- signature=dedda52028ba9cc6699359258f4ed5db,Нужны ли антибиотики при интравитреальных инъекциях?...
- linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...
- Fedora下的应用软件大集合
- 对于杯子、淘宝搜索框的测试用例