hdu 2121 Ice_cream’s world II (无定根最小树形图)
题目链接:
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 (无定根最小树形图)的更多相关文章
- HDU - 2121 Ice_cream’s world II 无根最小树形图
HDU - 2121 :http://acm.hdu.edu.cn/showproblem.php?pid=2121 比较好的朱刘算法blog:https://blog.csdn.net/txl199 ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- 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 ...
- HDU 2121——Ice_cream’s world II——————【最小树形图、不定根】
Ice_cream’s world II Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- hdu 2121 , hdu 4009 无定根最小树形图
hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...
- 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 ...
- HDU 2121 Ice_cream’s world II 最小树形图
这个题就是需要求整个有向带权图的最小树形图,没有指定根,那就需要加一个虚根 这个虚根到每个点的权值是总权值+1,然后就可以求了,如果求出来的权值大于等于二倍的总权值,就无解 有解的情况,还需要输出最根 ...
- hdoj 2121 Ice_cream’s world II 【没有最低树的根节点】
称号:pid=2121" target="_blank">hdoj 2121 Ice_cream's world II 题意:题目是一道躶题,给n个点,m条边的有向 ...
- HDU ACM 2121 Ice_cream’s world II (无根最小树形图)
[解题思路]这题先看了NotOnlySuccess的解题思路,即设置虚根再处理的做法:弄了一个上午,再次有种赶脚的感觉~~如果需要找出为什么需要去比所有权值之和更大的数为新增的虚边的话,一开始我理解仅 ...
随机推荐
- MySQL错误日志、binlog日志、查询日志、慢查询日志简介
1.数据库的日志是帮助数据库管理员,追踪分析数据库曾经发生的各种事件的有力依据,mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决以下问题:各个日志的作 ...
- TList实现的任务队列
TList实现的任务队列 var g_tasks: TList; type PTRecvPack = ^TRecvPack; TRecvPack = record // 接收到的原数据 socket: ...
- win10 localhost 解析为::1 的解决办法
win10 localhost 解析为::1 的解决办法 学习了:https://blog.csdn.net/ambertian/article/details/70238020
- JAVA_the user operation is waiting怎么办
彻底解决 MyEclipse出现the user operation is waiting的问题 2011-05-31 10:32:30| 分类: 软件编程 | 标签:java myecli ...
- linux core文件设置
http://blog.csdn.net/ctthuangcheng/article/details/8963551 linux core文件设置 分类: Linux OS Debugging Te ...
- Python爬虫开发【第1篇】【爬虫案例】
案例一:网站模拟登录 # douban.py from selenium import webdriver from selenium.webdriver.common.keys import Key ...
- JAVA泛型类
泛型是JDK 5.0后出现新概念,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. 泛型类引入的好处不 ...
- 理解ValueStack的基本机制
ValueStack基础:OGNL(Object Graphic Navigation Language) OGNL是Struts2中使用的一种表达式语言.它可以用于: · 在JSP页面,使用标签 ...
- HDU4185 Oil Skimming —— 最大匹配
题目链接:https://vjudge.net/problem/HDU-4185 Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memo ...
- 【繁琐工作自动化】pandas 处理 excel 文件
0. 一般处理 读取 excel 格式文件:df = pd.read_excel('xx.xlsx'),下面是一些简单查看文件内容的函数: df.head():展示前五行: df.columns:展示 ...