上下界網路流(3合1)

2021-08-14 12:19:50 字數 3084 閱讀 5098

我打的是loj的板子,因為比較全

具體做法就是將每一條限制為[l,r]的邊(u,v)拆開

連線(s,v)容量為l,(u,t)容量為l,(u,v)容量為r-l

大家可以感性地理解一下

資料範圍大的時候,可以先記錄每個點與起點終點的流量,最後減一減,一起連邊就好了

**:

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

const

int n=205,m=1e5+5,inf=0x3f3f3f3f;

int n,m,s,t,tot=-1,sum;

int head[n],to[m],next[m],flow[m],cur[n],ans[m];

int d[n],q[n],check1[m],check2[m],down[m],up[m],id[m];

inline

void addedge(int x,int y,int l)

inline

void ins(int x,int y,int lower,int upper)

inline

bool bfs()}}

return d[t]^inf;

}inline

int dfs(int x,int a)

}return f;

}inline

void dinic()

}int main()

dinic();

bool flag=1;

for(int i=1;i<=sum;++i)

}if(flag)

else

printf("no");

return

0;}

建立超源超匯ss,tt

然後連一條(t,s)容量inf

像之前那樣跑就好了,可以判無解

然後有解的話,跑s-t最大流就好了

**:

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

const

int n=205,m=1e5+5,inf=0x3f3f3f3f;

int n,m,s,t,tot=-1,sum,ss,tt;

int head[n],to[m],next[m],flow[m],cur[n],ans[m];

int d[n],q[n],check1[m],check2[m],down[m],up[m],id[m];

inline

void addedge(int x,int y,int l)

inline

void ins(int x,int y,int lower,int upper)

inline

bool bfs()}}

return d[tt]^inf;

}inline

int dfs(int x,int a)

}return f;

}inline

void dinic()

}inline

int dinic2()

return f;

}int main()

addedge(t,s,inf);

dinic();

bool flag=1;

for(int i=1;i<=sum;++i)

}if(!flag)

int ans=dinic2();

printf("%d",ans);

return

0;}

建立ss,tt,然後先跑ss-tt最大流

再連(t,s)容量inf,跑s-t最大流就好了

**:

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

inline

int read()

const

int n=5e4+5,m=8e5+5,inf=0x3f3f3f3f;

int n,m,s,t,tot=-1,sum,ss,tt;

int head[n],to[m],next[m],flow[m],cur[n],ans[m];

int d[n],q[n],check1[m],check2[m],down[m],up[m],id[m];

inline

void addedge(int x,int y,int l)

inline

void ins(int x,int y,int lower,int upper)

inline

bool bfs()}}

return d[tt]^inf;

}inline

int dfs(int x,int a)

}return f;

}inline

int dinic()

return f;

}int main()

int ans=0;

dinic();

addedge(t,s,inf);ans=tot-1;

dinic();

bool flag=1;

for(int i=1;i<=sum;++i)

}if(!flag)

printf("%d",inf-flow[ans]);

return

0;}

上下界網路流初探

看文章各種不明真相.請教了一下iwtwiioi大牛.大致有個理解.建模過程 1.拆邊.對於每一條給出的有向邊 u,v,c,d 其中c指下界,d指上界,那麼在實際的圖中連三條只有上界沒有下界的邊 s,v,c u,t,c u,v,d c 其中s是超級源,t是超級匯.不同於題目給出的源與匯 一條是超級源連...

上下界網路流專題

給定n點m邊無向圖,用k個人從起點出發,乙個人走一條路代價為路的長度li,你希望按照0,1,2,n的順序依次經過這些點,其中經過的定義是任何1人經過該點,問k個人最小的道路總和。n 150,m 20 000,1 k 10,li 10 000 考慮每次只有1個人走1步,已經過t點,則每次其中一人走向t...

有上下界網路流

前言 下面寫得只是一些十分基礎的東西,是給我以後自己看的,想要徹底弄明白這個內容,推薦去看liu runda。注 為了方便,下面所有的 x,y,l,r 都表示一條從x連向y,流量下界為l,流量上界為r的邊。問題簡述 給出乙個有向圖,每條邊有流量上下界,沒有源點和匯點,要求找到一種流的方法,使得每個點...