BZOJ3280: 小R的烦恼
2016-12-22 19:14
281 查看
题目链接
读完题,诶,这和餐巾计划很像。
然后就乱搞乱搞。。画了几张图,把样例混出来了!
很开心的交掉。WA!?我口胡错了么。。回头查,很好。∑ai没有清零。。再交,WA!!?又查。。很好很好,算的流量也没有清零。然后就,A掉了!!!?
S向每个学校连边,流量为li,费用为0。
每个学校向x”连边,流量为INF,费用为pi。
对于每一天x,每一家医院j。若x+c[j]+1<=n,则由x’向(x+c[j]+1)‘’建边,流量为INF,费用为d[j]。
【分析】
(不想看bb的直接略过)读完题,诶,这和餐巾计划很像。
然后就乱搞乱搞。。画了几张图,把样例混出来了!
很开心的交掉。WA!?我口胡错了么。。回头查,很好。∑ai没有清零。。再交,WA!!?又查。。很好很好,算的流量也没有清零。然后就,A掉了!!!?
【建图】
拆点,每一天x拆为x’和x”。S向x’连边,流量为ai,费用为0。x”向T连边,流量为ai,费用为0。x’向(x+1)’连边,流量为INF,费用为0。S向每个学校连边,流量为li,费用为0。
每个学校向x”连边,流量为INF,费用为pi。
对于每一天x,每一家医院j。若x+c[j]+1<=n,则由x’向(x+c[j]+1)‘’建边,流量为INF,费用为d[j]。
【代码】
#include <cstdio> #include <iostream> #include <queue> #include <vector> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #define N 155 #define M 10405 #define INF 1000000000 using namespace std; typedef long long ll; typedef pair<ll,ll> pa; int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();} return x*f; } int Case,CaseT,n,m,K,cnt=1,S,T,ans,Ans,sum; int b[M],p ,nextedge[M],w[M],c[M]; int Dis ,Pre ; bool Flag ; void Add(int x,int y,int z,int cost) { cnt++; b[cnt]=y; nextedge[cnt]=p[x]; p[x]=cnt; w[cnt]=z; c[cnt]=cost; } void Anode(int x,int y,int z,int cost){ Add(x,y,z,cost);Add(y,x,0,-cost); } void Input_Init() { n=read(),m=read(),K=read();T=(n<<1)+m+1; cnt=1;ans=sum=Ans=0; for(int i=0;i<=T;i++) p[i]=Pre[i]=0; static int x,y; for(int i=1;i<=n;i++) { x=read();sum+=x; Anode(i+n,T,x,0); Anode(0,i,x,0); if(i<n) Anode(i,i+1,INF,0); } for(int i=1;i<=m;i++) { x=read(),y=read(); Anode(0,i+n+n,x,0); for(int j=1;j<=n;j++) Anode(i+n+n,j+n,INF,y); } for(int j=1;j<=K;j++) { x=read(),y=read(); for(int i=1;i<=n;i++) if(i+x+1<=n) Anode(i,i+x+1+n,INF,y); } } bool Bfs() { queue<int>q; q.push(S); for(int i=1;i<=T;i++) Dis[i]=INF; while(!q.empty()) { int k=q.front();q.pop();Flag[k]=0; for(int i=p[k];i;i=nextedge[i]) { int v=b[i],f=w[i]; if(Dis[v]>Dis[k]+c[i]&&f) { Dis[v]=Dis[k]+c[i]; Pre[v]=i; if(!Flag[v]) { Flag[v]=1; q.push(v); } } } } return Dis[T]!=INF; } void Mcf() { int Maxf=INF; for(int i=Pre[T];i;i=Pre[b[i^1]]) Maxf=min(Maxf,w[i]); Ans+=Maxf; for(int i=Pre[T];i;i=Pre[b[i^1]]) { w[i]-=Maxf;w[i^1]+=Maxf; ans+=Maxf*c[i]; } } void MCF() { while(Bfs()) Mcf(); printf("Case %d: ",Case); if(sum!=Ans) printf("impossible\n"); else printf("%d\n",ans); } int main() { CaseT=read(); for(Case=1;Case<=CaseT;Case++) { Input_Init(); MCF(); } return 0; }
相关文章推荐
- bzoj 3280: 小R的烦恼 (网络流)
- bzoj 3280: 小R的烦恼(费用流)
- bzoj 3280: 小R的烦恼 费用流
- bzoj3280: 小R的烦恼
- 【bzoj3280】小R的烦恼 费用流
- 【BZOJ3280】小R的烦恼 最小费用最大流
- bzoj3280 小R的烦恼
- Bzoj3280 小R的烦恼
- BZOJ网络流+费用流大合集:【3280小R的烦恼】
- 【BZOJ】【3280】小R的烦恼
- bzoj3280 小R的烦恼
- BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发
- BZOJ3280: 小R的烦恼
- bzoj1221 [HNOI2001]软件开发 & bzoj3280 小R的烦恼
- 小R的烦恼 BZOJ3280
- bzoj1221 [HNOI2001]软件开发 & bzoj3280 小R的烦恼
- 【bzoj3280】小R的烦恼
- [BZOJ3280]小R的烦恼(费用流)
- BZOJ_3280_小R的烦恼_最小费用最大流
- BZOJ 3280: 小R的烦恼 费用流 多路增广