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\ ...
随机推荐
- 函数fsp_alloc_from_free_frag
/**********************************************************************//** Allocates a single free ...
- bzoj2005: [Noi2010]能量采集
lsj师兄的题解 一个点(x, y)的能量损失为 (gcd(x, y) - 1) * 2 + 1 = gcd(x, y) * 2 - 1. 设g(i)为 gcd(x, y) = i ( 1 < ...
- 解决IE6下浮动层固定定位的经典方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Math.trunc
- 利用改进的cca算法,进行识别
这个方法,很有意思,第一,不用降维:第二,跟ica做比较,竟然说比强大的ica还好: 看来,国防科大的博士,还是很牛的. <OI and fMRI Signal Separation Using ...
- 【转】移动web资源整理
目录(更新于20150311) meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速 ...
- HDU 5122 K.Bro Sorting
K.Bro Sorting Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Tot ...
- HDU 5745 La Vie en rose
La Vie en rose Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- IDEA与Tomcat创建并运行Java Web项目及servlet的简单实现
创建Web项目 1. File -> New Project ,进入创建项目窗口 2.在 WEB-INF 目录下点击右键, New -> Directory ,创建 classes 和 ...
- POST 一张 图像的调试来认识 http post
上传图片的详细 2559字节