BZOJ 4501 旅行


题目大意 : http://www.lydsy.com/JudgeOnline/problem.php?id=4501


首先对于每一个节点,如果f[u] max , 那么每一个 v 都应取到相应的max,那么我们可以按拓扑序逆序(也就是dfs序的逆序) 先算出来每一个f[v],然后再考虑每一个节点的更新,按题意来说, f[u]=f[v]+1 的最大值,由于是分式,我们考虑用01分数规划搞,我们设当前二分出来的值为mid , 则应满足 f[v] + 1 - 边数×mid >0 ,由于有限制条件,即有y边必须有x,就是一个典型的最小割了

#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-7;
const int MAXN = 50005,MAXM = 500005,S = 0,T = 5001,inf = 0x7fffffff;
bool vis[MAXN];
int n,m,k; double f[MAXN];
vector<int>G[MAXN];


template<typename _t>
inline _t read(){
    _t x=0,f=1;
    char ch=getchar();
    for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-f;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+(ch^48);
    return x*f;
}

struct Max_flow{
    int first[MAXN],e,d[MAXN],Q[MAXN];
    Max_flow(){clear();}
    struct edge{
        int u,v,next,id;double w;
    }a[MAXM];

    inline void clear(){
        memset(first,0,sizeof first); e = 2;
    }
    inline void add(int u,int v,int w){
        a[e].u = u;a[e].v = v;a[e].id = w;
        a[e].next = first[u];first[u] = e++;
    }
    inline void add(int u,int v,double w){
        a[e].u = u;a[e].v = v;a[e].w = w;
        a[e].next = first[u];first[u] = e++;
    }

    inline void push(int u,int v,double w){
        add(u,v,w);add(v,u,0.0);
    }

    inline bool bfs(){
        memset(d,-1,sizeof d); d[S] = 0;
        int l = 0,r = 1;Q[l] = S;
        while(l<r) {
            int u = Q[l++];
            for(int i = first[u];i;i=a[i].next) 
                if(d[a[i].v] == -1 && a[i].w) d[a[i].v] = d[u] + 1,Q[r++] = a[i].v;
        }
        return d[T] != -1;
    }

    inline double dfs(int u,double cap) {
        if(u == T || cap == 0) return cap;
        double Ans = 0.0;
        for(int i = first[u];i;i=a[i].next) {
            register int v = a[i].v; double w = a[i].w;
            if(d[v] == d[u] + 1 && w) {
                w = dfs(v,min(w,cap - Ans));
                Ans += w;
                a[i].w -= w;
                a[i^1].w += w;
                if(Ans == cap) return Ans;
            }
        }
        if(Ans == 0) d[u] = -1;
        return Ans;
    }

    inline double dinic(){
        double Ans = 0.0;
        while(bfs()) Ans += dfs(S,inf);
        return Ans;
    }

    inline void build_limit(int u){
        int sz = G[u].size();
        for(int i = 0;i<sz;i++) push(u,G[u][i],inf); 
    }

    inline void __dfs__(int);
}QAQ,QWQ;

inline void Max_flow::__dfs__(int u){
    if(vis[u]) return; vis[u] = 1;
    double l = 0.0,r = 0.0,Ans,mid;
    for(int i = first[u];i;i=a[i].next) {
        __dfs__(a[i].v);
        r = max(r,f[a[i].v] + 1.0);
    }
    while(l+1e-7<r) {
        Ans = 0.0; mid = (l + r)/2.0; QWQ.clear();
        for(int i = first[u];i;i=a[i].next) {
            register int v = a[i].v; QWQ.build_limit(a[i].id);
            if(f[v] + 1 < mid)  QWQ.push(S,a[i].id,mid - f[v] - 1);
            else QWQ.push(a[i].id,T,f[v] + 1 - mid),Ans += f[v] + 1 - mid;
        }
        if(Ans > QWQ.dinic()) f[u] = mid , l = mid;
        else r = mid;
    }
    // f[u] = max(f[v] + 1 / num > L)
    // --> f[v] + 1 - num * L > 0;
    // --> sigema(f[v] + 1 - num) > 0;
}

int main(){
    n = read<int>();m = read<int>(); k = read<int>();
    for(int i = 1;i<=m;i++) {
        register int u = read<int>(),v = read<int>();
        QAQ.add(u,v,i); 
    }
    for(int i = 1;i<=k;i++) {
        register int u = read<int>(),v = read<int>();
        G[v].push_back(u);
    }
    QAQ.__dfs__(1);
    printf("%lf\n",f[1]);
    return 0;
}
内容概要:本文介绍了一项创新性未发表的研究,即利用多元宇宙优化算法(Multiverse Optimizer, MVO)对分时电价下的需求响应与综合能源系统调度问题进行建模与求解,旨在实现能源系统的经济性、高效性与可持续性运行。该研究构建了包含多种能源设备(如光伏、风机、燃气轮机、储能系统等)及可调节负荷的综合能源系统模型,充分考虑了用户侧的需求响应行为在分时电价机制下的响应特性,通过MVO算法对系统运行成本、能源利用率、碳排放等多目标进行协同优化,实现了日前调度计划的智能决策。研究还提供了完整的MATLAB代码实现,便于研究人员复现实验、验证算法性能,并为进一步研究提供可靠的仿真基础。; 适合人群:具备一定电力系统、优化算法及MATLAB编程基础的科研人员、研究生以及从事能源互联网、综合能源系统规划与运行的技术工程师。; 使用场景及目标:① 学习并掌握多元宇宙优化算法在复杂能源系统调度中的具体应用方法;② 研究分时电价机制如何通过需求响应引导用户参与电网互动,实现削峰填谷;③ 实现综合能源系统(IES)中冷、热、电、气等多种能源的协同优化调度,以降低运行成本、提高新能源消纳能力和系统可靠性;④ 为相关领域的学术研究提供可复现的代码实例和仿真平台。; 阅读建议:此资源以MATLAB代码为核心载体,深入剖析了算法应用与系统建模的全过程。建议读者在学习时,不仅应关注代码的实现细节,更要理解其背后的数学模型、优化目标设定和约束条件的物理意义。建议结合文档中的模型描述,逐步调试代码,观察不同参数和场景下的优化结果,从而深刻掌握综合能源系统优化调度的设计思想与关键技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值