ZOJ 3496 Assignment | 二分+有上下界网络流

本文针对特定网络流问题提出了解决方案,包括如何找到满足最大流条件下流量最大边的最小值及流量最小边的最大值。通过二分查找和最大流算法实现,并详细介绍了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496

大概意思:给你一个网络,有源汇,在保证最大流的情况下求下面两个问题答案

1.所有边中流量最大的边流量最小

2.所有边中流量最小的边流量最大


题解:

De了一下午啊啊,之前学的上下界网络流有问题!

对于问题一,我们二分最大流量,每次建图跑最大流,看是不是和之前一样即可

对于问题二,我们同样二分答案lim,这样每条边满足流量限制w[i]∈[lim,c[i]]

这样建图跑有源汇最大流即可.

下面是坑点

之前写的有源汇最大流都是先跑可行流然后把超级源和超级汇删掉再跑,答案还得加加减减,但是就是Wa

后来发现其实并没有那么难,在可行流的残余网络直接再跑一边最大流就是答案

感性证明如下:

因为如果可行的话超级源的所有出边都满流,这样算最大流的时候只会算到t->s的反边上,又因为原来的可行流就在这条边上,这样直接就能算出答案

别忘了输出答案*p

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
typedef long long ll;
#define N 505
#define M 400005
#define INF 0x3f3f3f3f
using namespace std;
ll Case,n,m,t,s,P,ans1,ans2,S,T,ecnt,Maxflow,l,r,u[M],v[M],c[M],mid,Maxc,lim;
ll head[N],lev[N],cur[N],du[N];
queue <ll> q;
struct adj
{
    ll nxt,v,w;
} e[M];
ll read()
{
    ll ret=0,neg=1;
    char j=getchar();
    for (; j>'9' || j<'0'; j=getchar())
        if (j=='-') neg=-1;
    for (; j>='0' && j<='9'; j=getchar())
        ret=ret*10+j-'0';
    return ret*neg;
}
void add(ll u,ll v,ll w)
{
    e[++ecnt].v=v;e[ecnt].w=w;e[ecnt].nxt=head[u];head[u]=ecnt;
    e[++ecnt].v=u;e[ecnt].w=0;e[ecnt].nxt=head[v];head[v]=ecnt;
}
void init()
{
    ecnt=1;
    memset(head,0,sizeof(head));
}
bool Bfs()
{
    while (!q.empty()) q.pop();
    for (ll i=1; i<=lim; i++)
        cur[i]=head[i],lev[i]=-1;
    q.push(S),lev[S]=1;
    while (!q.empty())
    {
        ll u=q.front();
        q.pop();
        for (ll i=head[u],v; i; i=e[i].nxt)
            if (lev[v=e[i].v]==-1 && e[i].w>0)
            {
                q.push(v),lev[v]=lev[u]+1;
                if (v==T) return 1;
            }
    }
    return 0;
}
ll Dfs(ll u,ll flow)
{
    if (u==T) return flow;
    ll ret=0,delta;
    for (ll &i=cur[u],v; i; i=e[i].nxt)
        if (e[i].w>0 && lev[v=e[i].v]==lev[u]+1)
        {
            delta=Dfs(v,min(e[i].w,flow-ret));
            if (delta)
            {
                e[i].w-=delta;
                e[i^1].w+=delta;
                ret+=delta;
                if (ret==flow) break;
            }
        }
    return ret;
}
ll getG(ll lim)
{
    ll sum=0,tmp=0;
    init();
    add(t,s,INF);S=n+1,T=n+2;
    memset(du,0,sizeof(du));
    for (ll i=1; i<=m; i++)
        if (c[i]-lim<0) return -1;
        else add(u[i],v[i],c[i]-lim),du[u[i]]-=lim,du[v[i]]+=lim;
    for (ll i=1; i<=n; i++)
    {
        if (du[i]>0) add(S,i,du[i]),sum+=du[i];
        if (du[i]<0) add(i,T,-du[i]);
    }
    while (Bfs()) tmp+=Dfs(S,INF);
    if (tmp!=sum) return -1;
    tmp=0;S=s;T=t;
    while (Bfs()) tmp+=Dfs(S,INF);
    return tmp;
}
int main()
{
    Case=read();
    while (Case--)
    {
        n=read(),m=read(),s=read(),t=read(),P=read();
        init();
        S=++s;T=++t;
        Maxflow=Maxc=l=0;
        lim=n+2;
        for (ll i=1; i<=m; i++)
            u[i]=read(),v[i]=read(),c[i]=read(),add(++u[i],++v[i],c[i]),r=Maxc=max(Maxc,c[i]);
        while (Bfs()) Maxflow+=Dfs(S,INF);
        while (l<r)
        {
            init();
            ll mid=l+r>>1,tmp=0;
            for (ll i=1; i<=m; i++) add(u[i],v[i],min(c[i],mid));
            while (Bfs()) tmp+=Dfs(S,INF);
            if (tmp==Maxflow) r=mid;
            else l=mid+1;
        }
        ans1=l;l=0;r=Maxc;
        while (l<r)
        {
            ll mid=l+r+1>>1,tmp=0;
            if (getG(mid)==Maxflow) l=mid;
            else r=mid-1;
        }
        ans2=l;
        printf("%lld %lld\n",1ll*ans1*P,1ll*ans2*P);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/mrsheep/p/8215489.html

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值