网络流24题之餐巾计划问题
生活随笔
收集整理的這篇文章主要介紹了
网络流24题之餐巾计划问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:傳送門
時(shí)間有點(diǎn)趕,所以寫的簡(jiǎn)略一些了.
dalao:這道題不是看看就出來(lái)了嗎?
me:這道題十分難想啊!!!!圖好難建啊!!!!但是想到以后就是一個(gè)裸題啊!!
要拆點(diǎn),將每天拆為早上和晚上(干凈的和臟的).
如果不會(huì)拆點(diǎn)的話,你可以立即去世了,寫網(wǎng)絡(luò)流的題怎么能不會(huì)拆點(diǎn)呢?這是學(xué)網(wǎng)絡(luò)流必備的啊
- 建立源點(diǎn)匯點(diǎn).(廢話,那個(gè)網(wǎng)絡(luò)流的題不要建)
- 源點(diǎn)向每天晚上連一條邊,流量為當(dāng)天所需的紙巾數(shù),費(fèi)用為0。
- 匯點(diǎn)向每天早上連一條邊,流量為當(dāng)天所需的紙巾數(shù),費(fèi)用為0。
- 每天晚上向明天晚上連一條邊,流量為inf,費(fèi)用為0(將當(dāng)天的臟紙巾留到明天).
- 連快洗店,慢洗店的邊.從當(dāng)天晚上向過(guò)x天(洗紙巾的天數(shù))后那一天早上連一條邊,流量為inf,費(fèi)用為洗紙巾的費(fèi)用.
- 連買新紙巾的邊,從源點(diǎn)向每天早連一條邊,流量為inf,費(fèi)用為買新紙巾所需費(fèi)用。
理由呢......自己對(duì)著這個(gè)看看吧,應(yīng)該可以明白的.
注意判邊界啊
注意開long long 啊
#include<bits/stdc++.h> #define int long long const int inf=1e15; using namespace std; typedef long long ll; int read() {int x=0,f=1;char c=getchar();while(c<'0'||c>'9')f=(c=='-')?-1:1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f; } struct node {int to,next,v,w; } a[1000001]; int dis[10001],f[10001],pre[10001],fa[10001],s,t,n,m,head[10001],cnt,x,y,z,c; void add(int x,int y,int c,int v) {a[++cnt].to=y;a[cnt].next=head[x];a[cnt].v=c;a[cnt].w=v;head[x]=cnt; } queue < int > q; int spfa() {q.push(s);memset(dis,127,sizeof(dis));memset(f,0,sizeof(f));f[s]=1,dis[s]=0;int inf1=dis[s+1];while(!q.empty()) {int now=q.front();q.pop();f[now]=0;for(int i=head[now]; i; i=a[i].next) {int v=a[i].to;if(dis[v]>dis[now]+a[i].w&&a[i].v) {dis[v]=dis[now]+a[i].w,pre[v]=i,fa[v]=now;if(!f[v])f[v]=1,q.push(v);}}}if(dis[t]!=inf1)return 1;return 0; } int ans1,ans; void anser() {while(spfa()) {int minx=inf;for(int i=t; i!=s; i=fa[i])minx=min(minx,a[pre[i]].v);ans+=minx,ans1+=dis[t]*minx;for(int i=t; i!=s; i=fa[i])a[pre[i]].v-=minx,(pre[i]%2)?a[pre[i]+1].v+=minx:a[pre[i]-1].v+=minx;} } int a1[20001]; main() {n=read();int p,m,f,nn,ss,pp;ss=0,t=n*2+1;for(int i=1; i<=n; i++)a1[i]=read();for(int i=1; i<=n; i++)add(s,i,a1[i],0),add(i,s,0,0);for(int i=1; i<=n; i++)add(i+n,t,a1[i],0),add(t,i+n,0,0);p=read(),m=read(),f=read(),nn=read(),ss=read();for(int i=1; i<=n; i++)if(i+n+1<t)add(i+n,i+n+1,inf,0),add(i+n+1,i+n,0,0); for(int i=1; i<=n; i++)if(i+m+n<t)add(i,i+n+m,inf,f),add(i+n+m,i,0,-f);for(int i=1; i<=n; i++)if(i+nn+n<t)add(i,i+nn+n,inf,ss),add(i+nn+n,i,0,-ss);for(int i=1; i<=n; i++)add(s,i+n,1000000,p),add(i+n,s,0,-p);anser();printf("%lld",ans1); }轉(zhuǎn)載于:https://www.cnblogs.com/hbxblog/p/9733584.html
總結(jié)
以上是生活随笔為你收集整理的网络流24题之餐巾计划问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 记一次与iframe之间的抗争
- 下一篇: 小程序短视频项目———开发用户登录注册(