AC_Dream 1211 Reactor Cooling

简介:

/*
    题意:无源无汇,并且每条边的容量有上下界限的网络流问题!既然无源无汇,那么素有的节点都应该满足“入流==出流”!
         输出每一条边的流量,使得满足上面的条件。(如果u->v有流量,那么v->u就不会有流量)

    思路:如果增加了源点s和汇点t,对于u->v(下限为l, 上限为f) 将这一条边拆成3条,s->v(容量为l), u->v(容量为f-l)
     u->t(容量为l)这样就变成了每一个点的流入或者流出的流量至少是b!然后从s->t走一遍最大流,如果所有的附件边都已经
     满载,则就是所有s->v的边和u->t的边(或者只判断其中一者就可以),那么就存在答案!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define N 205
#define M 500000
using namespace std;

struct EDGE{
    int v, cap, tot, nt, b;
    EDGE(){};
    EDGE(int v, int cap, int nt, int b) : v(v), cap(cap), nt(nt), b(b), tot(cap){}
};

EDGE edge[M];
int n, m;
int first[N];
int pre[N], d[N];
int sz;
int s, t;
int full, fout; 

void addEdge(int u, int v, int b, int cap){
    edge[sz] = (EDGE(v, cap, first[u],b));
    first[u] = sz++;
    edge[sz] = (EDGE(u, 0, first[v], 0));
    first[v] = sz++;

    edge[sz] = (EDGE(v, b, first[s], 0));
    first[s] = sz++;
    edge[sz] = (EDGE(s, 0, first[v], 0));
    first[v] = sz++;

    edge[sz] = (EDGE(t, b, first[u], 0));
    full += b;
    first[u] = sz++;
    edge[sz] = (EDGE(u, 0, first[t], 0));
    first[t] = sz++;
}

bool bfs(){
    queue<int>q;
    memset(d, 0, sizeof(d));
    d[s] = 1;
    q.push(s);
    while(!q.empty()){
        int u = q.front(); q.pop();
        for(int i = first[u]; ~i; i = edge[i].nt){
            int v = edge[i].v;
            if(!d[v] && edge[i].cap >0){
                d[v] = d[u] + 1;
                q.push(v);
            }
        }
    }
    if(d[t] == 0) return false;
    return true;
}

int dfs(int u, int totf){
    int ff;
    if( u == t) return totf;
    int flow = 0;
    for(int i = first[u]; ~i && totf > flow; i = edge[i].nt){
        int v = edge[i].v;
        int cap = edge[i].cap;
        //流入u节点的当前总的流量为totf,可以得到 u->v1, u->v2, u->v3....这些路径上的最大流的和为flow+=f(u->vi)
        //f(u->vi)表示u节点沿着vi节点方向的路径上的最大流;如果u->vi+1的容量为wi+1,那么u->vi+1所允许流过的最大
        //的流量就是 min(totf - cost, wi+1)了!
        if(d[v] == d[u] + 1 && cap > 0 ){
            ff = dfs(v, min(totf - flow, cap));
            if(ff){
                edge[i].cap -= ff;
                edge[i^1].cap += ff;
                flow += ff;
            }
            else
                d[v] = -1;//表示v这个点无法在继续增广下去了
        }
    }
    return flow;//返回从u节点向外流出的最大流量!
}

bool Dinic(){
    while(bfs())
        fout += dfs(0, INF);//这一块没想到写成while(dfs())会超时....

    if( fout != full) return false;
    return true;
}

int main(){
     
        scanf("%d%d", &n, &m);
    memset(first, -1, sizeof(first));
    sz = 0;
    fout = full = 0;
    s = 0; t = n+1;
    int u, v, l, f;
    for(int i = 1; i <= m; ++i){
        scanf("%d%d%d%d", &u, &v, &l, &f);
        addEdge(u, v, l, f-l);
    }
    if(!Dinic()){
        printf("NO\n");
        return 0;
    }
    printf("YES\n");
    for(int i = 1; i <= m; ++i){
        int j = (i-1)*6;
        printf("%d\n",  edge[j].tot - edge[j].cap + edge[j].b);//输出这条边实际流过的流量+下限
    }

    return 0;
}

目录
相关文章
|
Android开发
autojs之保活
autojs打包的app经常在后台被杀,请做到以下几点来保活: autojs版本号
2522 0
autojs之保活
|
8月前
|
机器学习/深度学习 人工智能 算法
《深度洞察:AI助力MySQL性能困局突围》
在数据驱动的业务体系中,MySQL作为核心关系型数据库,常因数据量增长、应用复杂度提升而面临性能下降问题。传统人工排查效率低且难以应对复杂情况,而AI技术凭借强大的数据分析与模式识别能力,可高效定位性能瓶颈并提出优化方案。通过收集与分析MySQL性能指标、查询日志等数据,AI能精准发现异常根源,如查询优化问题或资源配置不足,并动态调整优化策略。这不仅提升了MySQL性能与稳定性,还为业务发展提供了坚实支撑,展现了AI在数据库管理领域的巨大潜力。
283 15
|
10月前
|
计算机视觉
RT-DETR改进策略【卷积层】| 2024最新轻量级自适应提取模块 LAE 即插即用 保留局部信息和全局信息
RT-DETR改进策略【卷积层】| 2024最新轻量级自适应提取模块 LAE 即插即用 保留局部信息和全局信息
287 4
RT-DETR改进策略【卷积层】| 2024最新轻量级自适应提取模块 LAE 即插即用 保留局部信息和全局信息
|
数据采集 前端开发 搜索推荐
|
存储 IDE Java
如何检查类文件是否被篡改?
类文件被篡改可能导致安全问题和程序异常。检查方法包括:1. 比对文件哈希值;2. 使用反编译工具对比代码;3. 检查文件签名。确保类文件的完整性和安全性。
295 3
|
Web App开发 前端开发 搜索推荐
创建HTML文件
【10月更文挑战第14天】创建HTML文件
420 4
|
机器学习/深度学习 算法 数据挖掘
Python实现聚类(Kmeans)分析客户分组
Python实现聚类(Kmeans)分析客户分组
Python实现聚类(Kmeans)分析客户分组
|
存储 缓存 NoSQL
DDIA 读书分享 第三章(上):LSM-Tree 和 B-Tree
DDIA 读书分享 第三章(上):LSM-Tree 和 B-Tree
400 0
DDIA 读书分享 第三章(上):LSM-Tree 和 B-Tree
|
机器学习/深度学习 资源调度 JavaScript
机器学习概念漂移检测方法(Aporia)
目前,有多种技术可用于机器学习检测概念漂移的方法。熟悉这些检测方法是为每个漂移和模型使用正确度量的关键。 在本文章中,回顾了四种类型的检测方法:统计、统计过程控制、基于时间窗口和上下文方法。
|
机器学习/深度学习 Shell Linux
安装Code-Server 4.0.1 的一些经验
在服务器上面安装自己的Code-Server,实现随时随地在任何终端任何地点,只要客户端的浏览器支持而且有网()就可以获得统一的编程体验
安装Code-Server 4.0.1 的一些经验