【BZOJ】4349: 最小树形图
题解
我们只考虑给每个点买一个,之后每个点就可以用最低价格买了
根据最小树形图的算法,就是不断给每个点入度的边找一条最小的
如果构成了树形图就退出,否则把形成了环的点缩成一个点,加上环的权值,然后把指向环中点的弧变成弧长减去环中指向该点的弧的长度
重标号让代码显得好难看啊QAQ
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 1000005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;char c = getchar();T f = 1;
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 + c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
int N,num[55],Ncnt,id[55];
db g[55][55],f[55][55],ans,val[55],tmp,minv[55];
int h[55][55],sta[55],top,low[55],dfn[55],idx,instack[55],tot;
int que[55],qr;
void Tarjan(int u) {
    low[u] = dfn[u] = ++idx;
    sta[++top] = u;
    instack[u] = 1;
    for(int v = 1 ; v < Ncnt ; ++v) {
        if(h[u][v]) {
            if(!dfn[v]) {Tarjan(v);low[u] = min(low[u],low[v]);}
            else if(instack[v] == 1) {low[u] = min(low[u],dfn[v]);}
        }
    }
    if(low[u] >= dfn[u]) {
        ++tot;
        qr = 0;
        while(1) {
            int x = sta[top--];
            id[x] = tot;
            que[++qr] = x;
            instack[x] = 2;
            if(x == u) break;
        }
        if(qr == 1) {val[que[1]] = 0;}
        else {
            for(int i = 1 ; i <= qr ; ++i) ans += val[que[i]];
        }
    }
}
void shortest_arborescence() {
    while(1) {
        memset(h,0,sizeof(h));
        tmp = 0.0;
        for(int i = 1 ; i < Ncnt ; ++i) {
            int t = Ncnt;
            for(int j = 1 ; j < Ncnt ; ++j) {
                if(g[j][i] < g[t][i]) t = j;
            }
            h[t][i] = 1;
            val[i] = g[t][i];
            tmp += val[i];
        }
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(instack,0,sizeof(instack));
        tot = 0;idx = 0;top = 0;
        for(int i = 1 ; i < Ncnt ; ++i) {
            if(!dfn[i]) Tarjan(i);
        }
        id[Ncnt] = ++tot;
        if(tot == Ncnt) {
            ans += tmp;
            break;
        }
        for(int i = 1 ; i <= tot ; ++i) {
            for(int j = 1 ; j <= tot ; ++j) {
                f[i][j] = 1000000000.0;
            }
        }
        for(int i = 1 ; i <= Ncnt ; ++i) {
            for(int j = 1 ; j <= Ncnt ; ++j) {
                if(id[i] == id[j]) continue;
                if(g[i][j] < 1000000000)
                    f[id[i]][id[j]] = min(f[id[i]][id[j]],g[i][j] - val[j]);
            }
        }
        Ncnt = tot;
        memcpy(g,f,sizeof(f));
    }
    printf("%.2lf\n",ans);
}
void Solve() {
    read(N);
    for(int i = 1 ; i <= N + 1 ; ++i) {
        for(int j = 1 ; j <= N + 1 ; ++j) {
            g[i][j] = 1000000000.0;
        }
    }
    for(int i = 1 ; i <= N ; ++i) {
        scanf("%lf",&minv[i]);
        read(num[i]);
        g[N + 1][i] = minv[i];
        if(num[i]) id[i] = ++Ncnt;
    }
    id[N + 1] = ++Ncnt;
    int k,A,B;db c;
    read(k);
    for(int i = 1 ; i <= k ; ++i) {
        read(A);read(B);scanf("%lf",&c);
        g[A][B] = min(g[A][B],c);
        if(num[A]) minv[B] = min(minv[B],c);
    }
    for(int i = 1 ; i <= N ; ++i) {
        if(num[i]) ans += minv[i] * (num[i] - 1);
    }
    for(int i = 1 ; i <= Ncnt ; ++i) {
        for(int j = 1 ; j <= Ncnt ; ++j) {
            f[i][j] = 1000000000.0;
        }
    }
    for(int i = 1 ; i <= N + 1; ++i) {
        if(!id[i]) continue;
        for(int j = 1 ; j <= N + 1; ++j) {
            if(!id[j]) continue;
            f[id[i]][id[j]] = g[i][j];
        }
    }
    memcpy(g,f,sizeof(g));
    shortest_arborescence();
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}
【BZOJ】4349: 最小树形图的更多相关文章
- 【刷题】BZOJ 4349 最小树形图
		Description 小C现在正要攻打科学馆腹地------计算机第三机房.而信息组的同学们已经建好了一座座堡垒,准备迎战.小C作为一种高度智慧的可怕生物,早已对同学们的信息了如指掌. 攻打每一个人 ... 
- bzoj 4349 最小树形图——朱刘算法
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4349. 学习博客:http://www.cnblogs.com/xzxl/p/7243466 ... 
- bzoj2260: 商店购物 && 4349: 最小树形图
		Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ... 
- bzoj2260: 商店购物&&4349: 最小树形图
		最小树形图问题啊 最小树形图是撒哩,就是给你一个有向图,确定一个根,要你到达所有点,那棵最短路径树的总边权 做这个用的是朱(jv)刘(lao)算法. 首先假如有多个联通块就无解啦 对应每个点(除了根) ... 
- 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图
		目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ... 
- 【BZOJ 2753】 2753: [SCOI2012]滑雪与时间胶囊 (分层最小树形图,MST)
		2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2457 Solved: 859 Descriptio ... 
- BZOJ 2260 商店购物(最小树形图)
		不会最小树形图的出门左转 其实如果确定每种商品第一件的购买顺序,那么剩下的商品肯定是以最优惠价格购买的. 如何确定各种商品第一件购买时的最小价值呢? 考虑如果购买了\(a_i\)这种商品,那么就能以\ ... 
- 【最小树形图(奇怪的kruskal)】【SCOI 2012】【bzoj 2753】滑雪与时间胶囊
		2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB Submit: 1621 Solved: 570 Description ... 
- [JSOI2008]小店购物 & bzoj4349:最小树形图      最小树形图
		---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ... 
随机推荐
- 如何整合Office Web Apps至自己开发的系统(二)
			WOPI项目的创建 首先用vs2012创建一个mvc4的程序.如图: 从上一篇我们可以知道,WOPI通讯主要通过两个服务: 一个是CheckFileInfo服务, 一个是GetFile服务. 所以下面 ... 
- Problem C: 多线程 解题报告
			Problem C: 多线程 Description 多线程是一种常见的加速手段,利用多个线程同时处理不同的任务可以一定程度上减少总耗时,达到提高效率的目的.然而,多个线程间的执行顺序是完全不可控的, ... 
- 【bzoj3529】 Sdoi2014—数表
			μhttp://www.lydsy.com/JudgeOnline/problem.php?id=3529 (题目链接) 题意 多组询问,每次给出${n,m,a}$.求$${\sum_{i=1}^n\ ... 
- 【转】在windows中使用Intellij Idea时选择自定义的64位JVM
			原文地址:https://www.iflym.com/index.php/code/201404190001.html 本文英文原文自:https://intellij-support.jetbrai ... 
- 解题:HAOI 2015 按位或
			题面 Min-Max容斥:对于集合S $min(S)=\sum_{s∈S}(-1)^{|s|+1}max(s)$ $max(S)=\sum_{s∈S}(-1)^{|s|+1}min(s)$ 那么这个题 ... 
- Python之旅:MySQL系列
			第一篇:初识数据库 第二篇:库操作 第三篇:表操作 第四篇:数据操作 第五篇:索引原理与慢查询优化 第六篇:数据备份.pymysql模块 第七篇:视图.触发器.事务.存储过程.函数 第八篇:ORM框架 ... 
- 8: springMVC ModelAndView 作用与功能解析
			Spring mvc视图机制 所有的web应用的mvc框架都有它定位视图的方式.Spring提供了视图解析器供你在浏览器中显示模型数据,而不必被拘束在特定的视图技术上. Spring的控制器Contr ... 
- Jenkins + Pipeline 构建流水线发布
			Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ... 
- 流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
			海康: rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream 说明: username: 用户名 ... 
- raphael.js 给元素 hover 添加glow() 外发光
			用raphael.js 给 svg画布里面添加个元素,嗯就圓好了,男人一般都喜欢圆形的东西,比如xx , xxx , 还有xxx $(document).ready(function() { var ... 
