只有1行,一个整数,代表最低成本
Day1
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define N 1000 #define inf 1000000000 using namespace std; int n,m,S; int point[N],next[N],v[N],remain[N],cost[N],tot=-1;; int u[N],deep[N],d[N],c,can[N],dis[N],laste[N]; void add(int x,int y,int z,int k) { tot++; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=z; cost[tot]=k; tot++; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0; cost[tot]=-k; } int addflow(int s,int t) { int now=t; int ans=inf; while (now!=s) { ans=min(ans,remain[laste[now]]); now=v[laste[now]^1]; } now=t; while (now!=s) { remain[laste[now]]-=ans; remain[laste[now]^1]+=ans; now=v[laste[now]^1]; } return ans; } bool spfa(int s,int t) { for (int i=s;i<=t;i++) dis[i]=inf; dis[s]=0; memset(can,0,sizeof(can)); queue<int> p; p.push(s); can[s]=1; while (!p.empty()) { int now=p.front(); p.pop(); for (int i=point[now];i!=-1;i=next[i]) if (dis[v[i]]>dis[now]+cost[i]&&remain[i]) { dis[v[i]]=dis[now]+cost[i]; laste[v[i]]=i; if (!can[v[i]]) { can[v[i]]=1; p.push(v[i]); } } can[now]=0; } if (dis[t]==inf) return false; int flow=addflow(s,t); c+=flow*dis[t]; return true; } void maxflow(int s,int t) { while (spfa(s,t)); } int main() { scanf("%d%d%d",&n,&m,&S); for (int i=1;i<=n;i++) scanf("%d",&u[i]); for (int i=1;i<=n;i++) scanf("%d",&d[i]); memset(next,-1,sizeof(next)); memset(point,-1,sizeof(point)); for (int i=1;i<=n;i++) { add(1,1+i,inf,d[i]); add(1+i,n+2,u[i],0); if (i!=n) add(i+1,i+2,S,m); } maxflow(1,n+2); printf("%d\n",c); }