hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121
题目意思大概是要你在一些城市中选一个做首都 , 要求首都都能到其他城市 , 道路花费要最少 , 且道路都是单向的 , 这个时候就要用到最小树形图算法了 , 而且是不固定根.
不定根就是加一个虚根(原本不存在的点) , 可以让这个虚根到每个点的距离大于原本所有点连接的道路花费之和sum , 然后计算出的结果减去sum,如果比sum还大就可以认为通过这个虚拟节点我们连过原图中两个点,即原图是不连通的,我们就可以认为不存在最小树形图。那么真正的根呢 , 在找最小入弧时,如果这条弧的起点是虚拟根,那么这条弧的终点就是要求的根,因为如果有多解的话,必然存在一个环,环上的顶点都可以做根,但是我们根据最小入边的性质,可知,如果没缩点,必然找不到那个根,因为虚拟根连的边都非常大。但是缩点后,找到的必然是最小的那个序号的根。(画图理解)
下面是代码:
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std;
const int MAXN = 1e3 + ;
typedef long long LL;
int id[MAXN] , vis[MAXN] , pre[MAXN] , pos;
LL INF = 1e17 , d[MAXN];
struct node {
int u , v , cost;
}edge[MAXN * MAXN]; LL zhuliu(int root , int V , int E) {
LL res = ;
while(true) {
for(int i = ; i < V ; i++) {
d[i] = INF;
}
for(int i = ; i < E ; i++) {
int u = edge[i].u , v = edge[i].v;
if(u != v && d[v] > edge[i].cost) {
d[v] = edge[i].cost;
pre[v] = u;
if(u == root) {
pos = i; //记录位置 除了这里不一样 其他地方都是朱刘算法的模板
}
}
}
for(int i = ; i < V ; i++) {
if(d[i] == INF && i != root) {
return -;
}
}
int cont = ;
memset(id , - , sizeof(id));
memset(vis , - , sizeof(vis));
d[root] = ;
for(int i = ; i < V ; i++) {
int v = i;
res += d[i];
while(id[v] == - && vis[v] != i && v != root) {
vis[v] = i;
v = pre[v];
}
if(id[v] == - && v != root) {
for(int u = pre[v] ; u != v ; u = pre[u]) {
id[u] = cont;
}
id[v] = cont++;
}
}
if(!cont) {
break;
}
for(int i = ; i < V ; i++) {
if(id[i] == -) {
id[i] = cont++;
}
}
for(int i = ; i < E ; i++) {
int 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].cost -= d[v];
}
}
V = cont;
root = id[root];
}
return res;
} int main()
{
int n , m;
while(~scanf("%d %d" , &n , &m)) {
LL sum = ;
for(int i = ; i < m ; i++) {
scanf("%d %d %d" , &edge[i].u , &edge[i].v , &edge[i].cost);
edge[i].u++ , edge[i].v++;
sum += edge[i].cost;
}
sum++; //边权大于总权值
for(int i = m ; i < n + m ; i++) {
edge[i].u = ; //0为虚拟节点
edge[i].v = i - m + ;
edge[i].cost = sum;
}
LL res = zhuliu( , n + , n + m); //n + 1 个点 n + m 条边
if(res == - || res - sum >= sum) { //要是res - sum < sum 的话就说明 0的出度为1 说明原图是连通图
printf("impossible\n\n");
}
else {
printf("%lld %d\n\n" , res - sum , pos - m);
}
}
}
不好意思.写的很搓.
hdu2121 - Ice_cream’s world II(朱刘算法,不固定根)的更多相关文章
- HDUOJ--2121--Ice_cream’s world II【朱刘算法】不定根最小树形图
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2121 题意:n个顶点,m条边,求从某一点起建立有向图最小生成树而且花费最小.输出最小花费和根节点下标. ...
- UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)
题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...
- UVa11183 Teen Girl Squad, 最小树形图,朱刘算法
Teen Girl Squad Input: Standard Input Output: Standard Output You are part of a group of n teenage ...
- hdu2121 Ice_cream's world II
hdu2121 Ice_cream's world II 给一个有向图,求最小树形图,并输出根节点 \(n\leq10^3,\ m\leq10^4\) 最小树形图 对于求无根最小树形图,可以建一个虚拟 ...
- 最小树形图——朱刘算法(Edmonds)
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 朱刘算法实现过程: [在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图] 1,选入 ...
- uva11865 朱刘算法+二分
这题说的需要最多花费cost元来搭建一个比赛网络,网络中有n台机器,编号为0 - n-1其中机器0 为服务器,给了n条线有向的和他们的花费以及带宽 计算,使得n台连接在一起,最大化网络中的最小带宽, ...
- POJ 3164 Command Network ( 最小树形图 朱刘算法)
题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...
- UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)
题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...
- 最小树形图--朱刘算法([JSOI2008]小店购物)
题面 luogu Sol 首先设一个 \(0\) 号点,向所有点连边,表示初始价值 显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值 再买就一定能优惠(包含 \(0\ ...
随机推荐
- HDU 4927 大数运算
模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...
- BZOJ3806: Neerc2011 Dictionary Size
题解: 这题搞得我真是酸(dan)爽(teng) 原来一直不会,一定会用到什么神奇的东西.因为重复的不知道如何计算. 今天中午睡起来忽然想到好像可以在正trie上故意走无出边,因为这样就保证了这次统计 ...
- OK - A byte of python - 读书笔记
看这本书的目的:再熟悉基本概念. 大部分都是知道,但是需要 明确 出来的 概念. - 欢迎吐槽错误,非常感谢. <A byte of python> - THIS 1. 组织行 - 形式: ...
- memcached 最大连接数及其内存大小的设置
memcached的基本设置: -p 监听的端口-l 连接的IP地址, 默认是本机-d start 启动memcached服务-d restart 重起memcached服务-d stop|shutd ...
- ORACLE RAC 监听配置 (listener.ora tnsnames.ora)
Oracle RAC 监听器的配置与单实例稍有不同,但原理和实现方法基本上是相同的.在Oracle中 tns进程用于为指定网络地址上的一个或多个Oracle 实例提供服务注册,并响应来自客户端对该服务 ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- mysql5.6子查询的优化
https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html Semi-join in MySQL 5.6 MySQL 5. ...
- 连接Excel文件时,未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
问题与解决 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 错误. string strCon = " Provider = Microsoft.Jet.OL ...
- jQuery 遍历 - parent() 方法
ylbtech-jQuery-sizzle:jQuery 遍历 - parent() 方法 parent() 获得当前匹配元素集合中每个元素的父元素,使用选择器进行筛选是可选的. 1.A,jQuer ...
- 关于java异常的一点思考
关于异常的一点思考 异常生命周期 异常的来源 所有的异常都是抛出来的 有底层api抛出的 有自定义抛出的 异常的处理 1, 运行时异常 不做任何处理仍可编译通过 不建议捕获(不建议用异常来做流程控制, ...