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 朱刘算法不定根相关推荐

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

    题意:给你一张带权有向图,让你求最大树形图.并在此前提下令n号结点父亲的编号最小. 比赛的时候套了个二分,TLE了. 实际上可以给每个边的权值乘1000,对于n号结点的父边,加上(999-父结点编号) ...

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

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

  3. [UVA - 11865]Stream My Contest(最小树形图+朱刘算法)

    本题过于简单,朱刘算法模板题,考虑二分一下带宽即可 title code title code #include <cstdio> #include <cstring> #in ...

  4. [POJ 3164]Command Network(最小树形图,朱刘算法)

    文章目录 title solution code title solution 读完翻译后,很明显就是个朱刘算法的板子题 最小树形图,就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 ...

  5. NOIP模拟题 通讯 强连通分量缩点 最小树形图--朱刘算法

    通讯 (message.cpp\c\pas) [问题描述] "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦 ...

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

    题目大意:给你N个点,M条有向边,问以哪个点为根结点时,能使最小生成树总权值达到最小,输出总权值和根. 如果构不成最小生成树,另外输出 解题思路:这题很巧妙,暴力枚举的话,肯定TLE,所以,这题就需要 ...

  7. 最小树形图 之 朱刘算法【模板】

    定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...

  8. 朱刘算法 有向图的最小生成树

    朱刘算法 有向图的类Prim算法,找有向图的最小生成树 最小树形图 树形图: 无有向环 除了根节点外,每个点入度为1 以某个点为根的一棵有向树,其边权之和为图中所有树形图中是最小的称为最小树形图. 朱 ...

  9. 朱刘算法(最小树形图)

    P4716 [模板]最小树形图 题目 题目描述 给定包含 nn 个结点, mm 条有向边的一个图.试求一棵以结点 rr 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 rr 为根的最小 ...

最新文章

  1. CV_CAST_8U(val);的意义
  2. spring @order控制对象的顺序
  3. 2018 Wannafly summer camp Day3--Knight
  4. CentOS7安装ipython
  5. KTH 皇家理工学院 计算机视觉和机器学习博士生 招生
  6. 类名引用static变量好处
  7. pytorch之过拟合的处理(Dropout)(笔记五)
  8. 引用axiv文献的问题
  9. java中map类型_Java中Map类型遍历的两种方式对比
  10. 广芯微电子产品使用笔记分享
  11. idea代码格式化详细总结(快捷键、格式化规则、格式化模板)
  12. matlab图像分割(肺实质)
  13. 防火墙与路由器的区别
  14. 姿态估计1-10:FSA-Net(头部姿态估算)-源码无死角讲解(5)-Feature aggregation
  15. js实现页面视频监控全屏
  16. 拉丁超立方——样本点空间转换
  17. Mac装机必备软件2020最全下载集合
  18. spring中<tx:annotation-driven>标签转为注解@EnableTransactionManagement
  19. 最新抖音简单无人直播教程
  20. 论文参考文献格式说明

热门文章

  1. Ubuntu 14.04+GT720M+CUDA8.0+CUDNN+PYCAFFE
  2. 数字图像处理(DIP)实验4 目标颜色识别
  3. Linux系统之LVM(逻辑卷管理)
  4. Python求解多个多元一次方程组(完整可运行版本代码)
  5. COVID-19 Cases Prediction (Regression)
  6. Google Pay支付遇到的问题
  7. signature=dedda52028ba9cc6699359258f4ed5db,Нужны ли антибиотики при интравитреальных инъекциях?...
  8. linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...
  9. Fedora下的应用软件大集合
  10. 对于杯子、淘宝搜索框的测试用例