麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

[BZOJ3698]XWW的難題(有源匯有上下界的最大流)

2019-11-14 12:40:13
字體:
來源:轉載
供稿:網友

題目描述

傳送門

題解

最大流和可行流的做法的區別:先ss->tt做一遍最大流,判斷是否可行;然后將t->s,inf這條邊去掉,再做一遍s->t的最大流,即為答案 這道題原圖的建圖方法是: 對于每一行i,s->i,[a(i,n),a(i,n)+1] 對于每一列j,j->t,[a(n,j),a(n,j)+1] 對于每一個點(i,j),i->j,[a(i,j),a(i,j)+1] 然后再按照有源匯有上下界對這個圖進行改造即可

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<queue>using namespace std;#define N 100005#define inf 1000000000int n,s,t,ss,tt,maxflow,in,out,ans;double a[105][105];int l[105][105],r[105][105],p[105][105];int tot,point[N],nxt[N],v[N],remain[N];int d[N],deep[N],last[N],cur[N],num[N];queue <int> q;void addedge(int x,int y,int cap){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;}void bfs(int t){ for (int i=1;i<=t;++i) deep[i]=t; deep[t]=0; for (int i=1;i<=t;++i) cur[i]=point[i]; while (!q.empty()) q.pop(); q.push(t); while (!q.empty()) { int now=q.front();q.pop(); for (int i=point[now];i!=-1;i=nxt[i]) if (deep[v[i]]==t&&remain[i^1]) { deep[v[i]]=deep[now]+1; q.push(v[i]); } }}int addflow(int s,int t){ int now=t,ans=inf; while (now!=s) { ans=min(ans,remain[last[now]]); now=v[last[now]^1]; } now=t; while (now!=s) { remain[last[now]]-=ans; remain[last[now]^1]+=ans; now=v[last[now]^1]; } return ans;}void isap(int s,int t){ bfs(t); for (int i=1;i<=t;++i) ++num[deep[i]]; int now=s; while (deep[s]<t) { if (now==t) { maxflow+=addflow(s,t); now=s; } bool has_find=false; for (int i=cur[now];i!=-1;i=nxt[i]) if (deep[v[i]]+1==deep[now]&&remain[i]) { has_find=true; cur[now]=i; last[v[i]]=i; now=v[i]; break; } if (!has_find) { int minn=t-1; for (int i=point[now];i!=-1;i=nxt[i]) if (remain[i]) minn=min(minn,deep[v[i]]); if (!(--num[deep[now]])) break; ++num[deep[now]=minn+1]; cur[now]=point[now]; if (now!=s) now=v[last[now]^1]; } }}int main(){ tot=-1;memset(point,-1,sizeof(point)); scanf("%d",&n); for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) { scanf("%lf",&a[i][j]); l[i][j]=floor(a[i][j]); r[i][j]=ceil(a[i][j]); } s=n+n+1,t=s+1,ss=t+1,tt=ss+1; for (int i=1;i<n;++i) { addedge(s,i,r[i][n]-l[i][n]); d[s]-=l[i][n],d[i]+=l[i][n]; addedge(n+i,t,r[n][i]-l[n][i]); d[n+i]-=l[n][i],d[t]+=l[n][i]; } for (int i=1;i<n;++i) for (int j=1;j<n;++j) { addedge(i,n+j,r[i][j]-l[i][j]); p[i][j]=tot; d[i]-=l[i][j],d[n+j]+=l[i][j]; } for (int i=1;i<=t;++i) { if (d[i]>0) addedge(ss,i,d[i]),in+=d[i]; if (d[i]<0) addedge(i,tt,-d[i]),out-=d[i]; } addedge(t,s,inf); if (in!=out) {puts("NO");return 0;} isap(ss,tt); if (maxflow!=in) {puts("NO");return 0;} remain[tot]=remain[tot^1]=0; isap(s,t); for (int i=1;i<n;++i) for (int j=1;j<n;++j) ans+=remain[p[i][j]]+l[i][j];
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久草在线免费资源站 | 日韩欧美色综合 | 亚州欧美视频 | 日韩精品一区二区三区中文 | 国产成人精品一区二区视频免费 | 国产91精品亚洲精品日韩已满 | 国产在线欧美日韩 | 精品一区二区三区网站 | 午夜精品毛片 | 日韩一级视频 | 主播粉嫩国产在线精品 | 欧美一级aa免费毛片 | 日本精品久久久一区二区三区 | 欧美精品欧美 | 国产妞干网 | 色中色在线播放 | 欧洲黄色一级视频 | 国产精品一区在线看 | 日日碰日日操 | 成人情欲视频在线看免费 | 国产精品九九久久一区hh | 国产欧美日韩在线不卡第一页 | 久久亚洲精品国产一区 | 中文字幕精品在线视频 | 色人阁在线视频 | 久久蜜桃精品一区二区三区综合网 | 九九热精品在线 | 伊人在线视频 | 国产精品久久久久av | 91午夜在线观看 | 国产亚洲精彩视频 | 黄网站在线播放视频免费观看 | fc2成人免费人成在线观看播放 | 久久久久久久亚洲精品 | 4p嗯啊巨肉寝室调教男男视频 | 色吧综合网 | 久章草在线视频 | 在线中文日韩 | 羞羞视频免费观看网站 | 久久综合av | 韩国三级日本三级香港三级黄 |