[POJ 1459 Power Network] Dinic网络流

[POJ 1459 Power Network] Dinic网络流

分类:Graph Max Flow

1. 题目链接

[POJ 1459 Power Network]

2. 题意描述

一个电网包含一些结点(电站、消费者、调度站),这些结点通过电线连接。每个结点u 可能被供给s(u)的电能,s(u)≥0;同时也可能产生p(u)的电能,0≤p(u)≤pmax(u);站点u 还有可能消费c(u)电能,0≤c(u)≤min( s(u), cmax(u) );可能传输d(u)的电能,d(u) = s(u) + p(u) - c(u)。
以上这些量存在以下限制关系:对每个电站,c(u) = 0;对每个消费者,p(u) = 0;对每个调度站,p(u) = c(u) = 0。
在电网中两个结点u 和v 之间最多有一条电线连接。从结点u 到结点v 传输L(u,v)的电能,0≤L(u,v)≤Lmax(u,v)。定义Con 为c(u)的总和,表示电网中消费电能的总和。本题的目的是求Con 的最大值。
电网的一个例子如图 所示。在图(a)中,电站结点u 的标记”x/y”代表p(u) = x、pmax(u) =y。消费者结点u 的标记”x/y”代表c(u) = x、cmax(u) = y。每条电线所对应的边(u,v),其标记”x/y”代表L(u,v) = x、Lmax(u,v) = y。在图(b)中,消费的最大电能Con = 6,图(a)列出了在此状态下各个站点的s(u)、p(u)、c(u)和d(u)。注意,如图(b)所示的电网中,电能的流动还存在其他状态,但消费的电能总和不超过6。

输入描述:
输入文件中包含多个测试数据。每个测试数据描述了一个电网。每个测试数据的第1行为4个整数:n np nc m,其中,0≤n≤100,代表结点数目; 0≤np≤n,代表电站数目;0≤nc≤n,代表消费者数目;0≤m≤n2,代表传输电线的数目。接下来有m 个三元组,(u,v)z,其中u和v为结点序号(结点序号从0 开始计起),0≤z≤1000,代表Lmax(u,v)的值。接下来有np 个二元组,(u)z,其中u 为电站结点的序号,0≤z≤10000,代表pmax(u)的值;每个测试数据的最后是nc 个二元组,(u)z,其中u 为消费者结点的序号, 0≤z≤10000,代表cmax(u)的值。所有数据都是整数。除三元组(u,v)z 和二元组(u)z 中不含空格外,输入文件中其他位置允许出现空格。测试数据一直到文件尾。

3. 解题思路

比较基础的一道网络流。新建一个源点 s 以及一个汇点t。将源点 s 到所有的电站连一条边,容量为每个电站所能产生的最大能量;将所有的消费节点与汇点t连一条边,容量为每个消费节点所能消费的最大能量。
最后跑一下Dinic就好了。

4. 实现代码

#include <queue>
#include <stack>
#include <ctime>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;
typedef long double LB;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef vector<int> VI;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;

void debug() { cout << endl; }
template<typename T, typename ...R> void debug (T f, R ...r) { cout << "[" << f << "]"; debug (r...); }

const int MX = 105; // 点数
const int MS = 2*MX*MX; // 边数

template<class T> struct Max_Flow {
    int n;
    int Q[MX], sign;
    int head[MX], level[MX], cur[MX], pre[MX];
    int nxt[MS], pnt[MS], E;
    T cap[MS];
    void Init (int n) {
        E = 0;
        this->n = n + 1;
        fill (head, head + this->n, -1);
    }
    void Add (int from, int to, T c, T rw = 0) {
        pnt[E] = to;
        cap[E] = c;
        nxt[E] = head[from];
        head[from] = E++;
        pnt[E] = from;
        cap[E] = rw;
        nxt[E] = head[to];
        head[to] = E++;
    }
    bool BFS (int s, int t) {
        sign = t;
        fill (level, level + n, -1);
        int *front = Q, *tail = Q;
        *tail++ = t;
        level[t] = 0;
        while (front < tail && level[s] == -1) {
            int u = *front++;
            for (int e = head[u]; e != -1; e = nxt[e]) {
                if (cap[e ^ 1] > 0 && level[pnt[e]] < 0) {
                    level[pnt[e]] = level[u] + 1;
                    *tail++ = pnt[e];
                }
            }
        }
        return level[s] != -1;
    }
    void Push (int t, T &flow) {
        T mi = INF;
        int p = pre[t];
        for (int p = pre[t]; p != -1; p = pre[pnt[p ^ 1]]) {
            mi = min (mi, cap[p]);
        }
        for (int p = pre[t]; p != -1; p = pre[pnt[p ^ 1]]) {
            cap[p] -= mi;
            if (!cap[p]) {
                sign = pnt[p ^ 1];
            }
            cap[p ^ 1] += mi;
        }
        flow += mi;
    }
    void DFS (int u, int t, T &flow) {
        if (u == t) {
            Push (t, flow);
            return;
        }
        for (int &e = cur[u]; e != -1; e = nxt[e]) {
            if (cap[e] > 0 && level[u] - 1 == level[pnt[e]]) {
                pre[pnt[e]] = e;
                DFS (pnt[e], t, flow);
                if (level[sign] > level[u]) {
                    return;
                }
                sign = t;
            }
        }
    }
    T Dinic (int s, int t) {
        pre[s] = -1;
        T flow = 0;
        while (BFS (s, t) ) {
            copy (head, head + n, cur);
            DFS (s, t, flow);
        }
        return flow;
    }
};
Max_Flow<LL>F;

char buf[50];
void rd() {
    scanf ("%s", buf);
    for (int i = 0; buf[i]; ++i) if (!isdigit (buf[i]) ) buf[i] = ' ';
}
int main() {
#ifdef ___LOCAL_WONZY___
    freopen ("input.txt", "r", stdin);
#endif // ___LOCAL_WONZY___
    int n, nc, np, m, u, v, c;
    while (~scanf ("%d %d %d %d", &n, &np, &nc, &m) ) {
        F.Init (n + 2);
        for (int i = 1; i <= m; ++i) {
            rd();
            sscanf (buf, "%d %d %d", &u, &v, &c);
            F.Add (u, v, c);
        }
        for (int i = 1; i <= np; ++i) {
            rd();
            sscanf (buf, "%d %d", &u, &c);
            F.Add (n, u, c);
        }
        for (int i = 1; i <= nc; ++i) {
            rd();
            sscanf (buf, "%d %d", &u, &c);
            F.Add (u, n + 1, c);
        }
        LL ans = F.Dinic (n, n + 1);
        printf ("%lld\n", ans);
    }
#ifdef ___LOCAL_WONZY___
    cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl;
#endif // ___LOCAL_WONZY___
    return 0;
}
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是一款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进一步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过程中提供有
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在 JavaScript 中实现点击展开与隐藏效果是一种非常实用的交互设计,它能够有效提升用户界面的动态性和用户体验。本文将详细阐述如何通过 JavaScript 实现这种功能,并提供一个完整的代码示例。为了实现这一功能,我们需要掌握基础的 HTML 和 CSS 知识,以便构建基本的页面结构和样式。 在这个示例中,我们有一个按钮和一个提示框(prompt)。默认情况下,提示框是隐藏的。当用户点击按钮时,提示框会显示出来;再次点击按钮时,提示框则会隐藏。以下是 HTML 部分的代码: 接下来是 CSS 部分。我们通过设置提示框的 display 属性为 none 来实现默认隐藏的效果: 最后,我们使用 JavaScript 来处理点击事件。我们利用事件监听机制,监听按钮的点击事件,并通过动态改变提示框的 display 属性来实现展开和隐藏的效果。以下是 JavaScript 部分的代码: 为了进一步增强用户体验,我们还添加了一个关闭按钮(closePrompt),用户可以通过点击该按钮来关闭提示框。以下是关闭按钮的 JavaScript 实现: 通过以上代码,我们就完成了点击展开隐藏效果的实现。这个简单的交互可以通过添加 CSS 动画效果(如渐显渐隐等)来进一步提升用户体验。此外,这个基本原理还可以扩展到其他类似的交互场景,例如折叠面板、下拉菜单等。 总结来说,JavaScript 实现点击展开隐藏效果主要涉及 HTML 元素的布局、CSS 的样式控制以及 JavaScript 的事件处理。通过监听点击事件并动态改变元素的样式,可以实现丰富的交互功能。在实际开发中,可以结合现代前端框架(如 React 或 Vue 等),将这些交互封装成组件,从而提高代码的复用性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值