日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu4280(最大流)

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4280(最大流) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

傳送門(mén):Island Transport

題意:有N個(gè)島嶼 M條無(wú)向路 每個(gè)路有一最大允許的客流量,求從最西的那個(gè)島嶼最多能運(yùn)用多少乘客到最東的那個(gè)島嶼。

分析:無(wú)向圖正反都加弧,權(quán)值一樣,這題點(diǎn)多,使用SAP優(yōu)勢(shì)大,點(diǎn)少時(shí)dinic好些。

?

dinic:8314ms

#pragma comment(linker,"/STACK:1024000000,1024000000") #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <limits.h> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 100000000 #define inf 0x3f3f3f3f #define eps 1e-6 #define N 100010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define PII pair<int,int> using namespace std; inline int read() {char ch=getchar();int x=0,f=1;while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f; } int n,m,vs,vt,tot; int pre[N],q[N],cur[N],h[N]; struct edge {int v,w,next;edge(){}edge(int v,int w,int next):v(v),w(w),next(next){} }e[N<<1]; void addedge(int u,int v,int w) {e[tot]=edge(v,w,pre[u]);pre[u]=tot++;e[tot]=edge(u,w,pre[v]);pre[v]=tot++; } void init() {memset(pre,-1,sizeof(pre));tot=0; } /*******************dinic************************/ int bfs() {int head=0,tail=1;memset(h,-1,sizeof(h));q[0]=vs;h[vs]=0;while(head!=tail){int u=q[head++];for(int i=pre[u];~i;i=e[i].next){int v=e[i].v,w=e[i].w;if(w&&h[v]==-1){h[v]=h[u]+1;q[tail++]=v;}}}return h[vt]!=-1; } int dfs(int u,int flow) {if(u==vt)return flow;int used=0;for(int i=cur[u];~i;i=e[i].next){int v=e[i].v,w=e[i].w;if(h[v]==h[u]+1){w=dfs(v,min(flow-used,w));e[i].w-=w;e[i^1].w+=w;if(e[i].w)cur[u]=i;used+=w;if(used==flow)return flow;}}if(!used)h[u]=-1;return used; } int dinic() {int res=0;while(bfs()){for(int i=1;i<=n;i++)cur[i]=pre[i];res+=dfs(vs,inf);}return res; } /********************dinic***********************/ void build() {int u,v,w;int mx=-inf,mn=inf;n=read();m=read();for(int i=1;i<=n;i++){u=read();v=read();if(u<mn)mn=u,vs=i;if(u>mx)mx=u,vt=i;}for(int i=1;i<=m;i++){u=read();v=read();w=read();addedge(u,v,w);} } int main() {int T;T=read();while(T--){init();build();printf("%d\n",dinic());} } View Code

?

SAP:2917ms

#pragma comment(linker,"/STACK:1024000000,1024000000") #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <limits.h> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 100000000 #define inf 0x3f3f3f3f #define eps 1e-6 #define N 100010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define PII pair<int,int> using namespace std; inline int read() {char ch=getchar();int x=0,f=1;while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f; } int n,m,vs,vt,tot,NV; int head[N],gap[N],level[N],q[N]; struct edge {int v,w,next;edge(){}edge(int v,int w,int next):v(v),w(w),next(next){} }e[N<<1]; void addedge(int u,int v,int w) {e[tot]=edge(v,w,head[u]);head[u]=tot++;e[tot]=edge(u,w,head[v]);head[v]=tot++; } void init() {memset(head,-1,sizeof(head));tot=0; } /***************************SAP***********************/ void bfs(int vt) {memset(level,-1,sizeof(level));memset(gap,0,sizeof(gap));level[vt]=0;gap[level[vt]]++;queue<int>que;que.push(vt);while(!que.empty()) {int u=que.front();que.pop();for(int i=head[u]; i!=-1; i=e[i].next) {int v=e[i].v;if(level[v]!=-1)continue;level[v]=level[u]+1;gap[level[v]]++;que.push(v);}} } int pre[N]; int cur[N]; int SAP() {bfs(vt);memset(pre,-1,sizeof(pre));memcpy(cur,head,sizeof(head));int u=pre[vs]=vs,flow=0,aug=inf;gap[0]=NV;while(level[vs]<NV) {bool flag=false;for(int &i=cur[u]; i!=-1; i=e[i].next) {int v=e[i].v;if(e[i].w&&level[u]==level[v]+1) {flag=true;pre[v]=u;u=v;aug=min(aug,e[i].w);if(v==vt) {flow+=aug;for(u=pre[v]; v!=vs; v=u,u=pre[u]) {e[cur[u]].w-=aug;e[cur[u]^1].w+=aug;}aug=inf;}break;}}if(flag)continue;int minlevel=NV;for(int i=head[u]; i!=-1; i=e[i].next) {int v=e[i].v;if(e[i].w&&level[v]<minlevel) {minlevel=level[v];cur[u]=i;}}if(--gap[level[u]]==0)break;level[u]=minlevel+1;gap[level[u]]++;u=pre[u];}return flow; } /**************************SAP**********************/ void build() {int u,v,w;int mx=-inf,mn=inf;n=read();m=read();NV=n+1;for(int i=1;i<=n;i++){u=read();v=read();if(u<mn)mn=u,vs=i;if(u>mx)mx=u,vt=i;}for(int i=1;i<=m;i++){u=read();v=read();w=read();addedge(u,v,w);} } int main() {int T;T=read();while(T--){init();build();printf("%d\n",SAP());} } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/lienus/p/4294436.html

總結(jié)

以上是生活随笔為你收集整理的hdu4280(最大流)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。