【codeforces 724E】Goods transportation

【题目链接】:http://codeforces.com/problemset/problem/724/E

【题意】

有n个城市;
这个些城市每个城市有pi单位的物品;
然后已知每个城市能卖掉si单位单位的物品;
且每个城市i能向城市j最多运送c单位的物品(这里j严格大于i);
问你最多能在这n个城市里面卖掉多少单位的物品;

【题解】

可以转化为最大流模型;
虚拟一个起点s和源点t;
在s和n个城市之间分别建n条边pi;
在n个城市和t之间分别建n条边si;
在n个城市之间(x,y)建n*(n-1)/2条边;这里(x< y)
然后从起点跑最大流就能得到答案;
因为n很大;
不能单纯地跑最大流;
根据最大流=最小割;
写个DP吧
每个点最后,肯定是只和s连、或者是和t连;
不可能说两条边都删掉;
则对于每个点,看他删掉的是哪条边;

/*
    设f[i][j]表示前i个城市中,有j个城市和起点s相连的最小割;
    则
    f[i][j] = min(f[i-1][j-1]+s[i],f[i-1][j]+p[i]+j*c);
                 (删掉i和t的边,删掉i和起点s的边);
                                因为和起点s相连的点,可以从s到那个点
                                然后再到点i再到终点t,所以要多加上j*c;
                                即把那j条边删掉
    f[i][0] = f[i-1][0]+p[i];//不能连i和s边了,即只能删掉i和s边了
    f[i][i] = f[i-1][i-1]+s[i];//不能删i和s边了,即只能删掉i和t边了
*/


【Number Of WA

0

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e4+100;

LL f[2][N],p[N],s[N],c;
int n,now,pre;

int main()
{
    //freopen("F:\\rush.txt","r",stdin);
    ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
    cin >> n >> c;
    rep1(i,1,n) cin >> p[i];
    rep1(i,1,n) cin >> s[i];
    rep1(i,1,n)
    {
        now = now^1;
        f[now][0] = f[now^1][0]+p[i];
        rep1(j,1,i-1)
            f[now][j] = min(f[now^1][j-1]+s[i],f[now^1][j]+p[i]+j*c);
        f[now][i] = f[now^1][i-1]+s[i];
    }
    LL ans = f[now][0];
    rep1(i,1,n)
        ans = min(ans,f[now][i]);
    cout << ans << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626331.html