1009 I am your Father! (最小树形图-朱刘算法)

题目链接 HDU6141 I am your Father!

求有向图最大生成树,要求n的父节点尽量小。

我们将所有wi变为-wi,这题就变成了有向图最小生成树的模板题。对于f(n)尽可能小的要求,可以令所有wi扩大1000倍,然后 对于yi=n的点将1000-xi计入wi中,这样就保证了在W尽可能大的情况下f(n)尽可能小。有向图最小生成树的部分我们可以 O(nm)解决,大体思路是先找到每个点边权最小的父向边,然后这样连边可能会构成一些环,我们把这些环缩成一个点,然后把这个环向外连的边的权值减去向内连的边的权值,然后将这个图缩小,重复上述操作直至不再构成环。由于每次点数至少会减1,所以这样的操作至多做O(n)次,因此时间复杂度就是O(n*m)。

朱刘算法中不能记录路径,其中的fa[i]对应缩点后的下标。不过没关系,父节点非常好求,就是答案对1000取模。

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=1001;
const int M=10001;
const int INF=0x3f3f3f3f;
struct edge{int u,v,w;}e[M];
int fa[N],id[N],vis[N],in[N];
int n,m; int zhuliu(int rt){
int res=0,u,v;
while(1){
for(int i=0;i<n;i++)in[i]=INF;
for(int i=0;i<m;i++)
if(e[i].u!=e[i].v&&e[i].w<in[e[i].v]){
fa[e[i].v]=e[i].u; in[e[i].v]=e[i].w;
}
for(int i=0;i<n;i++)if(i!=rt&&in[i]==INF)return -1;
int cnt=0;
mem(id,-1);mem(vis,-1);
in[rt]=0;
for(int i=0;i<n;i++){
res+=in[i];v=i;
while(vis[v]!=i&&id[v]==-1&&v!=rt){
vis[v]=i;v=fa[v];
}
if(v!=rt&&id[v]==-1){//有环
for(u=fa[v];u!=v;u=fa[u])id[u]=cnt;//缩点
id[v]=cnt++;
}
}
if(cnt==0)break;
for(int i=0;i<n;i++)if(id[i]==-1)id[i]=cnt++;
for(int i=0;i<m;i++){
v=e[i].v;
e[i].u = id[e[i].u];
e[i].v = id[e[i].v];
if(e[i].u != e[i].v)
e[i].w -= in[v];
}
n=cnt;rt=id[rt];
}
return res;
} int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
c*=1000;
if(v==n)c+=1000-u;
e[i]=(edge){u-1,v-1,-c};
}
int ans = zhuliu(0);
printf("%d %d\n", -ans/1000, 1000-(-ans%1000));
}
return 0;
}

「2017 Multi-University Training Contest 8」2017多校训练8的更多相关文章

  1. 「2017 Multi-University Training Contest 7」2017多校训练7

    1002 Build a tree(递归) 题目链接 HDU6121 Build a tree 有一棵n个点的有根树,标号为0到n-1,i号点的父亲是\(\lfloor\frac{i-1}{k}\rf ...

  2. 「2017 Multi-University Training Contest 2」2017多校训练2

    1001 Is Derek lying 题目链接 HDU6045 Is Derek lying? 给出两个人选择题的回答,问得分分别为x和y是否可能.(\(1\le N \le 80000,0\le ...

  3. 「2017 Multi-University Training Contest 1」2017多校训练1

    1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #inc ...

  4. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  5. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

  6. 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数

    /** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...

  7. 2017 Wuhan University Programming Contest (Online Round) D. Events,线段树区间更新+最值查询!

    D. Events 线段树区间更新查询区间历史最小值,看似很简单的题意写了两天才写出来. 题意:n个数,Q次操作,每次操作对一个区间[l,r]的数同时加上C,然后输出这段区间的历史最小值. 思路:在线 ...

  8. 2018 Multi-University Training Contest 9 杭电多校第九场 (有坑待补)

    咕咕咕了太久  多校博客直接从第三场跳到了第九场orz 见谅见谅(会补的!) 明明最后看下来是dp场 但是硬生生被我们做成了组合数专场…… 听说jls把我们用组合数做的题都用dp来了遍 这里只放了用组 ...

  9. 2018 Multi-University Training Contest 3 杭电多校第三场

    躺了几天 终于记得来填坑了 1001 Ascending Rating   (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 ...

随机推荐

  1. 福州大学软件工程1816 | W班 第3次作业成绩排名

    写在前面 汇总成绩排名链接 1.作业链接 第三次作业--原型设计(结对第一次) 2.评分准则 本次作业总分 25分,由以下部分组成: (1)在随笔开头请加上该博客链接,以方便阅读时查看作业需求,并备注 ...

  2. Python之发邮件

    使用模块yagmail(使用收藏的yagmail,现在的第三方模块不能解决中文乱码问题) import yagmail user='xxx@126.com' password='xxxxxx' #使用 ...

  3. 【Python3练习题 009】 打印出所有的“水仙花数”

    # [Python练习题 009] 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,# 其各位数字立方和等于该数本身.例如:153是一个“水仙花数”,# 因为153=1的三次方+5的三次方+ ...

  4. git客户端下载 和安装

    网址  https://git-scm.com/download/win 点击next 说明: (1)图标组件(Addition icons) : 选择是否创建桌面快捷方式. (2)桌面浏览(Wind ...

  5. django学习自修第一天【简介】

    1. MVC框架 MVC框架的核心思想是解耦,降低各功能之间的耦合性,方便重构代码 (1)低耦合,高内聚 (2)高可扩展性 (3)向后兼容 2. MVT框架 V(视图):核心处理,接受请求,调用模型获 ...

  6. lr分布式测试--笔记

    LR 架构: controller做测试控制 scenario做测试场景的控制 vuser模拟用户和 load generator做负载产生 通过MI listener 跨防火墙监听 来实现分布式测试 ...

  7. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  8. web.xml中三种通配符及匹配规则

    一.url-pattern的三种写法 1.精确匹配.以”/”开头,加上servlet名称:    /ad  ; 2.路径匹配.以”/”开头,加上通配符”*” :    /*  ; 3.扩展名匹配.以通 ...

  9. 关于构造器中的super()

    1.为什么在子类的constructor里面要加一句super()? 答:如果子类用了extends的关键字继承的父类,那么子类在使用构造器的时候就要加super()语句,这是语法规范,就是这么定的. ...

  10. Vuex的API文档

    前面的话 本文将详细介绍Vuex的API文档 概述 import Vuex from 'vuex' const store = new Vuex.Store({ ...options }) [构造器选 ...