洛谷P2792 [JSOI2008]小店購物(最小樹形圖)

来源:https://www.cnblogs.com/zwfymqz/archive/2018/11/28/10035214.html
-Advertisement-
Play Games

題意 "題目鏈接" Sol 一開始的思路:新建一個虛點向每個點連邊,再加上題面中給出的邊,邊權均為大小 需要購買的數量 然後發現死活都過不去 看了題解才發現題目中有個細節——買了$A$就可以買$B$,但是人家沒告訴你必須買夠$A$的數量才能買$B$呀qwqqqqqqq 所以建圖的時候只算一次貢獻就行 ...


題意

題目鏈接

Sol

一開始的思路:新建一個虛點向每個點連邊,再加上題面中給出的邊,邊權均為大小*需要購買的數量

然後發現死活都過不去

看了題解才發現題目中有個細節——買了\(A\)就可以買\(B\),但是人家沒告訴你必須買夠\(A\)的數量才能買\(B\)呀qwqqqqqqq

所以建圖的時候只算一次貢獻就行了

這樣剩下的個數都可以通過最小值買到

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, INF = 1e9 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c -'0', c = getchar();
    return x * f;
}
int N, M, R, m[MAXN], id[MAXN], vis[MAXN], fa[MAXN];
double mn[MAXN], val[MAXN];
struct Edge {
    int u, v; double w; int nxt;
}E[MAXN];
int head[MAXN], num = 1;
inline void AddEdge(int x, int y, double w) {
    E[num] = (Edge) {x, y, w, head[x]}; head[x] = num++;
}
double ZhuLiu() {
    double ans = 0; R = N;
    while("Liang Liang") {
        for(int i = 1; i <= N; i++) id[i] = vis[i] = 0, mn[i] = 1e9; int cnt = 0, x;
        for(int i = 1; i <= num; i++) 
            if(E[i].v != E[i].u && (mn[E[i].v] > E[i].w)) 
                mn[E[i].v] = E[i].w, fa[E[i].v] = E[i].u;
        mn[R] = 0;
        for(int i = 1; i <= N; i++) {
            ans += mn[i];
            for(x = i; (!id[x]) && (vis[x] != i) && x != R; x = fa[x]) vis[x] = i; //tag
            if(x != R && (!id[x])) {
                id[x] = ++cnt;
                for(int t = fa[x]; t != x; t = fa[t]) id[t] = cnt;
            }
        }
        if(cnt == 0) return ans;
        for(int i = 1; i <= N; i++) if(!id[i]) id[i] = ++cnt;
        for(int i = 1; i <= num; i++) {
            double pre = mn[E[i].v];
            if((E[i].u = id[E[i].u]) != (E[i].v = id[E[i].v])) E[i].w -= pre;
        }
        N = cnt; R = id[R];
    }
    return ans;
}
int main() {
    N = read();
    for(int i = 1; i <= N; i++) {
        scanf("%lf", &val[i]), m[i] = read(), AddEdge(N + 1, i, val[i]);
    }
    N++;
    M = read();
    for(int i = 1; i <= M; i++) {
        int x = read(), y = read(); double z; scanf("%lf", &z);
        AddEdge(x, y, z); val[y] = min(val[y], z);
    } 
    double ans = 0;
    for(int i = 1; i <= N - 1; i++) ans += 1.0 * (m[i] - 1) * val[i];// printf("%d\n", m[i] - 1);
    printf("%.2lf", ans + ZhuLiu());
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在複習Java基礎,第一課就是JDK的安裝配置以及環境變數的配置,不多廢話,直接開始吧 (1)去Oracle官方網站下載JDK 1.8 Java的歷史想必大家也清楚,Sun公司開發的一門面向對象的編程語言,後來Sun公司被Oracle收購,於是Java也理所當然的成了Oracle的 JDK 1. ...
  • Zipkin是什麼Zipkin分散式跟蹤系統;它可以幫助收集時間數據,解決在microservice架構下的延遲問題;它管理這些數據的收集和查找;Zipkin的設計是基於谷歌的Google Dapper論文。每個應用程式向Zipkin報告定時數據,Zipkin UI呈現了一個依賴圖表來展示多少跟蹤請 ...
  • 1. Mapping(映射) Mapping 是定義文檔及其包含的欄位是如何存儲和索引的過程 例如,我們用映射來定義: 哪些字元串欄位應該被當做全文欄位 哪些欄位包含數字、日期或地理位置 是否應該將文檔中所有欄位的值索引到catch-all欄位中 1.1. Mapping Type(映射類型) 每個 ...
  • Elastic-Job是一個分散式調度解決方案,由兩個相互獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。 Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分散式任務的協調服務。 官方主頁 CSDN- elastic job ...
  • 好記憶不如爛筆頭: ...
  • redis-cachecloud https://github.com/sohutv/cachecloud/wiki/3.%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%8E%A5%E5%85%A5%E6%96%87%E6%A1%A3 ...
  • DNS DomainNameSystem功能變數名稱系統,根據功能變數名稱查出IP地址 1.dig命令可以顯示整個查詢的過程 root@VM-38-204-ubuntu:~# dig www.sopans.com //這一段是查詢參數和統計 ; > DiG 9.10.3-P4-Ubuntu > www.sopans... ...
  • """提示:代碼中的內容均被註釋,請參考,切勿照搬""" """註意:代碼切勿照搬,錯誤請留言指出""" ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...