acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】

acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

称号:acdream 1211 Reactor Cooling

分类:无汇的有上下界网络流。

题意:

   n个点。及mpipe,每根pipe用来流躺液体的。单向的。每时每刻每根pipe流进来的物质要等于流出去的物质,要使得mpipe组成一个循环体。里面流躺物质。

而且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题)。同一时候最小不能低于Li

比如:

46(4个点,6pipe)
12 1 3 (1->2上界为3,下界为1)
23 1 3
3 4 1 3
4 1 1 3
1 3 1 3
4 2 1 3

可行流:

 

acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】

再如:全部pipe的上界为2下界为1的话,就不能得到一种可行流。

 

题解:

上界用ci表示,下界用bi表示。

下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– bi

主要思想:每个点流进来的流=流出去的流

对于每个点i,令

Mi= sum(i点全部流进来的下界流)– sum(i点全部流出去的下界流)

假设Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。

假设Mi小于0,代表此点必须还要流进来Mi的自由流。那么我们从该点连一条Mi的边到汇点。

假设求S->T的最大流,看是否满流(S的相邻边都流满)

满流则有解,否则无解。

 

acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】

 


AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#define Del(a,b) memset(a,b,sizeof(a))
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 250;
struct Node
{
    int from,to,cap,flow;
};
vector<int> v[N];
vector<Node> e;
int vis[N];  //构建层次图
int cur[N];
void add_Node(int from,int to,int cap)
{
    e.push_back((Node){from,to,cap,0});
    e.push_back((Node){to,from,0,0});
    int tmp=e.size();
    v[from].push_back(tmp-2);
    v[to].push_back(tmp-1);
}
bool bfs(int s,int t)
{
    Del(vis,-1);
    queue<int> q;
    q.push(s);
    vis[s] = 0;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=0;i<v[x].size();i++)
        {
            Node tmp = e[v[x][i]];
            if(vis[tmp.to]<0 && tmp.cap>tmp.flow)  //第二个条件保证
            {
                vis[tmp.to]=vis[x]+1;
                q.push(tmp.to);
            }
        }
    }
    if(vis[t]>0)
        return true;
    return false;
}
int dfs(int o,int f,int t)
{
    if(o==t || f==0)  //优化
        return f;
    int a = 0,ans=0;
    for(int &i=cur[o];i<v[o].size();i++) //注意前面 ’&‘,非常重要的优化
    {
        Node &tmp = e[v[o][i]];
        if(vis[tmp.to]==(vis[o]+1) && (a = dfs(tmp.to,min(f,tmp.cap-tmp.flow),t))>0)
        {
            tmp.flow+=a;
            e[v[o][i]^1].flow-=a; //存图方式
            ans+=a;
            f-=a;
            if(f==0)  //注意优化
                break;
        }
    }
    return ans;  //优化
}
int dinci(int s,int t)
{
    int ans=0;
    while(bfs(s,t))
    {
        Del(cur,0);
        int tm=dfs(s,inf,t);
        ans+=tm;
    }
    return ans;
}
void MP_clear(int n)
{
    for(int i=0;i<=n;i++)
        v[i].clear();
    e.clear();
}
int come[N],to[N];
int flow[N][N];
struct Node1
{
    int x,y;
}num[N*N];
int main()
{
    int n,m;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        Del(come,0);
        Del(to,0);
        Del(flow,0);
        int s=0,t = n+1;
        for(int i=0;i<m;i++)
        {
            int x,y,mi,ma;
            scanf("%d%d%d%d",&x,&y,&mi,&ma);
            num[i] = (Node1){x,y};
            flow[x][y] += mi;
            add_Node(x,y,ma-mi);
            come[x]+= mi;
            to[y] += mi;
        }
        int count=0;
        for(int i=1;i<=n;i++)
        {
            int tmp = come[i]-to[i];
            if(tmp<0)
            {
                count+=tmp;
                add_Node(s,i,-tmp);
            }
            if(tmp>0)
                add_Node(i,t,tmp);
        }
        count = -count;
        int ans = dinci(s,t);
        if(ans != count)
            puts("NO");
        else
        {
            puts("YES");
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<v[i].size();j++)
                {
                    int f = v[i][j];
                    flow[e[f].from][e[f].to]+=abs(e[f].flow);
                    //printf("xx %d %d %d \n",e[f].from,e[f].to,e[f].flow);
                }
            }
            for(int i=0;i<m;i++)
            {
                printf("%d\n",flow[num[i].x][num[i].y]);
            }
        }
        if(T)
            puts("");
        MP_clear(t);
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116795.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VUE如何关闭Eslint 的方法

    VUE如何关闭Eslint 的方法最近在家里面创建vue项目的时候,手一抖把UseESLinttolintyourcode?(Y/N)选择了Y,然后到写代码的时候,虽然说是浏览器完全能运行结果,但是在cmd就是一直报错。强迫症没有办法。所以大家安装的时候最好选择N.如果不小心选择错了没有关系的,下面就是解决办法,一)在你的项目中找到build—–&gt;webpack.base.conf.js文件…

    2022年4月29日
    131
  • pandas 处理缺失值[dropna、drop、fillna][通俗易懂]

    pandas 处理缺失值[dropna、drop、fillna][通俗易懂]面对缺失值三种处理方法:option1:去掉含有缺失值的样本(行)option2:将含有缺失值的列(特征向量)去掉option3:将缺失值用某些值填充(0,平均值,中值等)对于dropna和fillna,dataframe和series都有,在这主要讲datafame的对于option1:使用DataFrame.dropna(axis=0,how=’any’,thres…

    2022年9月18日
    0
  • java自定义注解怎么实现注解(怎么获取自定义注解内的值)

    TL;DRJava注解广泛运用在开发之中,用于增强变量/方法/类等。尝试说明Java自定义注解的使用,以及通过开源项目中的使用进行说明。本文主要记录个人的理解,全文基于JavaSE8。自定义注解自定义注解分为两个部分:注解声明和注解处理逻辑。每个注解可以有多个属性值,同名注解通过声明后可以在对象上使用多个。注解结构定义注解用以下实例说明:12345678910@Repeatable(Lea…

    2022年4月13日
    97
  • java中dao层和service层的区别,为什么要用service?[通俗易懂]

    读了下面的文章让我豁然开朗我能不能理解ssh中service就相当于与jsp+servlet+dao中的servlet???转文:首先解释面上意思,service是业务层,dao是数据访问层。呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这个有什么用,参加工作久了以

    2022年4月7日
    137
  • L3-023 计算图(链式求导+bfs拓扑|dfs)「建议收藏」

    L3-023 计算图(链式求导+bfs拓扑|dfs)「建议收藏」原题链接“计算图”(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络。 图中的节点表示基本操作或输入变量,边表示节点之间的中间值的依赖性。 例如,下图就是一个函数 ( 的计算图。现在给定一个计算图,请你根据所有输入变量计算函数值及其偏导数(即梯度)。 例如,给定输入,,上述计算图获得函数值 (;并且根据微分链式法则,上图得到的梯度 ∇。知道你已经把微积分忘了,所以这里只要求你处理几个简单的算子:加法、减法、乘

    2022年8月8日
    6
  • 游戏手机平台简单介绍

    游戏手机平台简单介绍由于手机游戏市场的巨大潜力和无限商机,许多厂商纷纷推出功能强大的手机并提供开放应用平台,而相关手机游戏开发商也是相继投入,与手机厂商或运营商者合作,推出各种跨平台的解决方案。从最早的内嵌式游戏到最新的3D游戏基于各种技术和平台的手机游戏也是分类繁多,为了让读者更好了解各个游戏平台的特点和主要功能,我们将通过下文对目前市面上流行的手机游戏平台做一个简单的介绍。嵌入/内置式游戏

    2022年6月9日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号