题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=2121

题目大意:

  有n个点,有m条单向路,问这n个点组成最小树形图的最小花费。

解题思路:

1:构造虚根最小树形图

  因为是不定根,所以我们可以假设一个虚拟根,分别与n个点都有一条权值为r的虚边,假如我们把r设的非常大的话,我们求出来的最小数形图去掉虚点和虚边就是最小树形图了,如果去掉虚点和虚边图形变得不连通了,那么说明这n个点不存在最小树形图,因为r非常大,并且不存在任何一条边替换掉r,使得图形连通。

2:不含虚拟点的最小树形图的根节点

  因为在缩点的时候我们需要给每一个点进行从新编号,这样对于我们是很尴尬的,于是我们只能从边上下手咯,我们在每次对点进行从新编号的时候记录下虚拟节点的出边编号。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = ;
const int N = ;
const double Exp = 1e-;
const int INF = 0x3f3f3f3f; struct Edge
{
int u, v, w;
}; Edge edge[N];
int rt;
int directed_MST (int root, int n, int m)
{
int ans = , u, v, i;
int pre[maxn], pr[maxn], vis[maxn], id[maxn];
while (true)
{
for (i=; i<n; i++)
pre[i] = INF;
for (i=; i<m; i++)
{
u = edge[i].u;
v = edge[i].v;
if (pre[v]>edge[i].w && u!=v)
{
pre[v] = edge[i].w;
pr[v] = u;
if (u == root)
rt = i;
}
}
for (i=; i<n; i++)
{
if (i == root)
continue;
if (pre[i] == INF)
return -;
}
memset (vis, -, sizeof(vis));
memset (id, -, sizeof(id));
pre[root] = ;
int cru = ;
for (i=; i<n; i++)
{
ans += pre[i];
v = i;
while (vis[v]!=i && id[v]==- && v!=root)
{
vis[v] = i;
v = pr[v];
}
if (v!=root && id[v]==-)
{
for (u=pr[v]; u!=v; u=pr[u])
id[u] = cru;
id[u] = cru++;
}
}
if (cru == )
break;
for (i=; i<n; i++)
if (id[i] == -)
id[i] = cru++;
for (i=; i<m; i++)
{
u = edge[i].u;
v = edge[i].v;
edge[i].u = id[u];
edge[i].v = id[v];
if (id[u] != id[v])
edge[i].w -= pre[v];
}
n = cru;
root = id[root];
}
return ans;
}
int main ()
{
int n, m;
while (scanf ("%d %d", &n, &m) != EOF)
{
int r = ;
for (int i=; i<m; i++)
{
scanf ("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w);
r += edge[i].w;
}
r += ;
for (int i=; i<n; i++)
edge[i+m].u = n, edge[i+m].v = i, edge[i+m].w = r;
int num = directed_MST(n, n+, m+n);
if (num==- || num - r >= r)
printf ("impossible\n\n");
else
printf ("%d %d\n\n", num - r, rt - m);
}
return ;
}

hdu 2121 Ice_cream’s world II (无定根最小树形图)的更多相关文章

  1. HDU - 2121 Ice_cream’s world II 无根最小树形图

    HDU - 2121 :http://acm.hdu.edu.cn/showproblem.php?pid=2121 比较好的朱刘算法blog:https://blog.csdn.net/txl199 ...

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

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

  3. hdu 2121 Ice_cream’s world II

    Ice_cream’s world II http://acm.hdu.edu.cn/showproblem.php?pid=2121 Time Limit: 3000/1000 MS (Java/O ...

  4. HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】

    Ice_cream’s world II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  5. hdu 2121 , hdu 4009 无定根最小树形图

    hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...

  6. HDU 2121 Ice_cream’s world II 不定根最小树形图

    题目链接: 题目 Ice_cream's world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  7. HDU 2121 Ice_cream’s world II 最小树形图

    这个题就是需要求整个有向带权图的最小树形图,没有指定根,那就需要加一个虚根 这个虚根到每个点的权值是总权值+1,然后就可以求了,如果求出来的权值大于等于二倍的总权值,就无解 有解的情况,还需要输出最根 ...

  8. hdoj 2121 Ice_cream’s world II 【没有最低树的根节点】

    称号:pid=2121" target="_blank">hdoj 2121 Ice_cream's world II 题意:题目是一道躶题,给n个点,m条边的有向 ...

  9. HDU ACM 2121 Ice_cream’s world II (无根最小树形图)

    [解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...

随机推荐

  1. HDU1087 Super Jumping! Jumping! Jumping!(LIS)

    题目意思: http://acm.hdu.edu.cn/showproblem.php? pid=1087 此题的意思求最长上升子序列的和. 题目分析: 在求最长上升子序列的时候,不在保存最长的个数, ...

  2. [转]图解eclipse 查看原始类出现The jar file rt.jar has no source attachment

    原文:http://blog.csdn.net/u011514810/article/details/53196371 ---------------------------------------- ...

  3. Visual Studio VS如何重置所有设置

    工具-导入和导出设置-重置所有设置,点击下一步即可.                  

  4. COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建

    1.创建一个物理世界 首先要引入一个头文件#include "Box2D\Box2D.h" 之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向. word = n ...

  5. OpenCV---在图片上加入文字

    /****************************************** func:cvText desc:put text on an image @param img The ima ...

  6. 鸟哥的Linux私房菜-----13、账号管理

  7. CV_HAAR_FEATURE_DESC_MAX和CV_HAAR_FEATURE_MAX

    #define CV_HAAR_FEATURE_MAX 3 //提前定义的一个宏,在程序中表示一个haar特征由至多三个矩形组成 #define CV_HAAR_FEATURE_DESC_MAX 20 ...

  8. UICollectionView 具体解说学习

    UICollectionView 和UITableView非常像,是APPLE公司在iOS 6后推出的用于处理图片这类UITableView 布局困难的控件,和UITableView 一样,它也有自己 ...

  9. Effective C++学习笔记(Part Four:Item 18-25)

     近期最终把effectvie C++细致的阅读了一边.非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此,必备查找使用,假设总结有什么不 当之处,欢迎批评指正: 如今仅仅列出框架 ...

  10. springmvc的异常统一处理

    在项目实际开发中,异常的统一处理是一个常态.假如不使用异常统一处理,我们往往需要在service层中捕获异常,并且根据不同的异常在result中的设置不同的code并给予相应的提示.这样可能会导致不同 ...