codeforces 546E 分类: codeforces ...

本文深入探讨网络流算法的核心思维,通过实例讲解算法的实现过程。从建立边的函数到Dinic算法的运用,详细解析了如何求解最大流问题,并通过具体代码展示了算法的运行流程。

网络流,主要看思维,CF有官方题解。


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>

const int MAXN = 105, MAXM = 205, INF = 1<<30;

int n, m;
int ss, tt, ind;

int a[MAXN], b[MAXN];
int an[MAXN], bn[MAXN];
int maxflow, sa, sb;

int cap[MAXN<<1][MAXN<<1];

int dep[MAXN<<1];

std::queue<int> line;

void BuildEdge(int u,int v,int w)
{
    cap[u][v] = w, cap[v][u] = 0;
}

int BFS()
{
    memset(dep,0,sizeof(dep));
    dep[ss] = 1, line.push(ss);

    while(!line.empty())
    {
        int t = line.front(); line.pop();
        for(int i = 1; i <= ind; i++)
            if(cap[t][i] > 0 && !dep[i]) 
                dep[i] = dep[t] + 1, line.push(i);      
    }

    return dep[tt];
}

int DFS(int a,int flow)
{
    if(a == tt || flow == 0) return flow;

    int ret = 0;

    for(int i = 1; i <= ind && flow; i++)
        if(cap[a][i] > 0 && dep[i] == dep[a] + 1)
        {
            int ff = DFS(i,std::min(flow,cap[a][i]));

            flow -= ff;

            cap[a][i] -= ff;
            cap[i][a] += ff;

            ret += ff;
        }
    return ret; 
}
int Dinic()
{
    int ret = 0;
    while(1)
    {
        if(!BFS()) break;
        ret += DFS(ss,INF);
    }
    return ret;
}

int main()
{
#ifndef ONLINE_JUDGE    
    freopen("546E.in","r",stdin);
    freopen("546E.out","w",stdout);
#endif

    std::cin >> n >> m;

    for(int i = 1; i <= n; i++)
        std::cin >> a[i];
    for(int i = 1; i <= n; i++)
        std::cin >> b[i];

    ss = ++ind, tt = ++ind;

    for(int i = 1; i <= n; i++)
    {
        an[i] = ++ind, bn[i] = ++ind;

        BuildEdge(ss,an[i],a[i]);
        BuildEdge(bn[i],tt,b[i]);
        BuildEdge(an[i],bn[i],INF);

        sa += a[i], sb += b[i];
    }
    for(int i = 1,u,v; i <= m; i++)
    {
        std::cin >> u >> v;
        BuildEdge(an[u],bn[v],INF);
        BuildEdge(an[v],bn[u],INF);
    }

    maxflow = Dinic();

    if(maxflow == sa && maxflow == sb)
    {
        puts("YES");
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
                std::cout << cap[bn[j]][an[i]] << ' ';
            std::cout << std::endl; 
        }   
    }
    else
        puts("NO");

#ifndef ONLINE_JUDGE    
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dashgua/p/4723022.html

【从高压输电线的架空地线中汲取电能】一个25千瓦受控电源从735千伏线路的架空地线中汲取电能的SimPowerSystems模型(Simulink仿真实现)内容概要:本文介绍了一个基于SimPowerSystems的Simulink仿真模型,用于模拟从735千伏高压输电线的架空地线中汲取25千瓦电能的受控电源系统。该模型聚焦于高压输电线路中架空地线的能量回收技术,通过仿真手段实现对电能采集过程的建模与控制策略验证,体现了电力系统中新型能源获取方式的技术可行性与工程应用潜力。文中还提及该资源属于一系列电力系统仿真研究的一部分,涵盖微电网、储能优化、碳流追踪、鲁棒调度等多个前沿方向,配套提供Matlab/Simulink代码及网盘资料链接,便于科研人员复现与拓展研究。; 适合人群:具备电力系统基础知识、熟悉Matlab/Simulink仿真环境,从事电力工程、能源回收或智能电网相关研究的科研人员及研究生;有一定编程与建模仿真经验的高年级本科生或工程技术人员。; 使用场景及目标:①研究高压输电线路中架空地线的能量回收机制与建模方法;②掌握基于Simulink的电力系统仿真技术,特别是受控电源与电网交互的动态特性分析;③为开展能源 harvesting、分布式供能、电力电子变换器控制等相关课题提供参考模型与技术支撑; 阅读建议:建议结合提供的仿真模型文件进行实操演练,重点理解系统结构设计、参数设置与控制逻辑实现;同时可延伸学习文档中提到的其他电力系统优化与仿真案例,以拓宽研究视野和技术积累。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值