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\ ...
随机推荐
- BZOJ3218: a + b Problem
题解: 先做60分... 考虑最小割,连边容量为需要付出的代价.不妨设在s割为黑色,t割为白色. (s,i,b[i])(i,t,w[i]) 关于奇怪,因为不是按份数来的.所以我们这样建图: (i,i+ ...
- td内容自动换行 ,td超过宽度显示点点点… , td 使用 overflow:hidden 无效,英文 数字 不换行 撑破div容器
我们可以先给表格 table上 固定一个宽度 不让表格撑破 width: 747px; table-layout:fixed; 然后我们在td上加上如下样式 style="width:100 ...
- apache开源项目 -- Wicket
[infoq] Apache Wicket是一个功能强大.基于组件的轻量级Web应用框架,能将展现和业务逻辑很好地分离开来.你能用它创建易于测试.调试和支持的高质量Web 2.0应用.假设其他团队交付 ...
- ftp在shell脚本中的使用方法
1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地的/home/databackup#####!/bin/bashftp -n<<!open 1 ...
- sql给数据库加锁问题
加锁是在操作数据时进行了,不能事后加锁. 例: begin tran insert 表 with(TABLOCKX) --加锁 (字段列表) ...
- 【转】linux中wait与waitpid的差别
原文网址:http://blog.163.com/libo_5/blog/static/15696852010324287748/ zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存 ...
- 开源Jabber(XMPP) IM服务器介绍
一.摘要 这是我粗略读了一遍Jabber协议和相关技术文章后的产物,有些地方不一定准确.在文章中引用的一些代码来自www.jabber.org上的文章. 二. 什么是Jabber Jabber就 ...
- ch03-文字版面的设计
Ch03: 文字版面的编辑 3.1 版面控制标记 3.1.1 取消文字换行: <NOBR> 1-取消换行文字实例:1-取消换行文字实例; 1-取消换行文字实例; 2-取消换行文字实例:2- ...
- Android入门:用HttpClient模拟HTTP的GET和POST请求
一.HttpClient介绍 HttpClient是用来模拟HTTP请求的,其实实质就是把HTTP请求模拟后发给Web服务器: Android已经集成了HttpClient,因此可以直接使用: ...
- visual studio 2013 配置 ef+pgsql
环境:VS2013,WIN7 准备工作: 1.有哪些供应商提供EF6的支持? 可以看msdn给出的答案:Which providers are available for EF6? 在本文使用 Dev ...