【链接】点击打开链接


【题意】


在这里写题意

【题解】


先设一个超级源点,向每个片区都建一条边,容量为b,费用为-a;
然后从每个片区再连一条边,指向一个超级汇点.
容量为d,费用为c;
然后从起点到汇点跑一下最大费用流就好.
(把spfa的最短路改成最长路就是最大费用流了);
这个费用流,在求只会出现正数的费用的时候是不用考虑那么多的.
显然我们这里是有负数的
所以有可能到了某个时刻,增广路得到的费用为负数,这个时候,我们就不能继续按照这条路卖东西了.
这意味着我们继续走的话,会亏本.
所以虽然还没得到最大流,也应该停手了.
只能按照之前的方案得到最大利润了,不能再继续做增广路了。
也就是说,有一些题目,在得到最大流之前,就可能已经得到最优的方案了.
(有负数的情况下);

【错的次数】


1

【反思】


边的个数一定要看清楚啊。
要记得你加了双向边。

【代码】

#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)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) 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 = 500;
const int NN = 1000 + 4000;
const int INF = 0x3f3f3f3f; struct abc{
    int from,en,flow,nex,cost;
}; int n,m,totm,fir[N+50],dis[N+50],pre[N+50],mi[N+50],ans;
abc bian[NN+100];
bool inq[N+50];
queue <int> dl; void add(int x,int y,int flow,int cost){
    bian[totm].nex = fir[x];
    fir[x] = totm;
    bian[totm].from = x;
    bian[totm].en = y;
    bian[totm].cost = cost;
    bian[totm].flow = flow;
    totm++;     bian[totm].nex = fir[y];
    fir[y] = totm;
    bian[totm].from = y;
    bian[totm].en = x;
    bian[totm].cost = -cost;
    bian[totm].flow = 0;
    totm++;
} bool spfa(int s,int t){
    ms(dis,-INF),ms(inq,0),ms(mi,INF);
    dis[s] = 0,inq[s] = 1;
    dl.push(s);
    pre[t] = -1;
    while (!dl.empty()){
        int x = dl.front();
        inq[x] = false;
        dl.pop();
        for (int i = fir[x];i!=-1;i = bian[i].nex){
            int y = bian[i].en;
            if (bian[i].flow && dis[y] < dis[x] + bian[i].cost){
                dis[y] = dis[x] + bian[i].cost;
                mi[y] = min(bian[i].flow,mi[x]);
                pre[y] = i;
                if (!inq[y]){
                    inq[y] = true;
                    dl.push(y);
                }
            }
        }
    }
    if (dis[t] < 0) return false;
    int now = t;
    while (now != s){
        int temp = pre[now];
        bian[temp].flow -= mi[t];
        bian[temp^1].flow += mi[t];
        now = bian[temp].from;
    }
    ans += dis[t]*mi[t];
    return true;
} int main(){
    //Open();
    //Close();
    while (~ri(n)){
        ri(m);
        ans = 0;
        totm = 0;
        ms(fir,255);
        rep1(i,1,n){
            int a,b,c,d;
            ri(a),ri(b),ri(c),ri(d);
            add(0,i,b,-a);
            add(i,n+1,d,c);
        }
        rep1(i,1,m){
            int x,y,k;
            ri(x),ri(y),ri(k);
            add(x,y,INF,-k);
            add(y,x,INF,-k);
        }
        while (spfa(0,n+1));
        oi(ans);puts("");
    }
    return 0;
}

【2017"百度之星"程序设计大赛 - 初赛(B)】度度熊的交易计划的更多相关文章

  1. 2017"百度之星"程序设计大赛 - 资格赛 1002 度度熊的王国战略

    全局最小割 Stoer-Wagner (SW算法)优化 优化吃藕了,感谢放宽时限,感谢平板电视 (pb_ds) #include <iostream> #include <cstdi ...

  2. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. HDU 6109 数据分割 【并查集+set】 (2017"百度之星"程序设计大赛 - 初赛(A))

    数据分割 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. HDU 6108 小C的倍数问题 【数学】 (2017"百度之星"程序设计大赛 - 初赛(A))

    小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. HDU 6122 今夕何夕 【数学公式】 (2017"百度之星"程序设计大赛 - 初赛(A))

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))

    度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. 2017"百度之星"程序设计大赛 - 初赛(A) [ hdu 6108 小C的倍数问题 ] [ hdu 6109 数据分割 ] [ hdu 6110 路径交 ] [ hdu 6112 今夕何夕 ] [ hdu 6113 度度熊的01世界 ]

    这套题体验极差. PROBLEM 1001 - 小C的倍数问题 题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6108 (2017"百度之星 ...

  10. [SinGuLaRiTy] 2017 百度之星程序设计大赛 初赛B

    [SinGuLaRiTy-1037] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Chess Time Limit: 2000/1000 ...

随机推荐

  1. ADO.Net数据库帮助类

    public interface IDBHelper { /// <summary> /// 执行sql语句 /// </summary> /// <param name ...

  2. BZOJ 4144 Dijkstra+Kruskal+倍增LCA

    思路: 先把所有的加油站 push进按weight排序的优先队列里 对于每个不是加油站的点 找到到它的点的最短路以及它来源的加油站 如果x和y有边 且x和y加油站的来源不一样 则它可以连边 跑一边Kr ...

  3. 【转】Android应用底部导航栏(选项卡)实例

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其 ...

  4. 图论:Tarjan算法

    在有向图中,若两点至少包含一条路径可以到达,则称两个顶点强连通,若任意两个顶点皆如此,则称此图为强联通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected com ...

  5. XT800 在域环境在运行设置

    测试时先将防火墙关了,不然无法远程,找个问题后再打开防火墙 0. 防火墙中建立规则,允许XT800通过. 1.在客户端当前用户下运行XT800安装程序 2.输入管理员账号及密码 3.安装时选择D或E盘 ...

  6. tensorflow学习之路---简单的代码

    import numpyimport tensorflow as tf #自己创建的数据x_data = numpy.random.rand(100).astype(numpy.float32)#创建 ...

  7. 【Docker自定制镜像之Dockerfile】

    镜像的定制,就是定制每一层所添加的配置.文件,如果可以把每一层修改.安装.构建.操作的命令都写入到一个脚本中,用脚本来构建.定制镜像,这个脚本就是Dockerfile Dockerfile是一个文本文 ...

  8. Android布局之RelativeLayout

    RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_center ...

  9. {head first} --- networking 3

    Chapter 10 无线网络 续 .. Chapter 11 网络安全 Chapter 12 设计网络 涉及到物理的设计网络布局等.我没细看. 附录

  10. C/C++(语句,数组)

    C语言语句: 两大选择,三大循环,四大跳转 两大跳转:if,switch 三大循环:for,while,do-while 四大跳转:break,continue,goto,return do-whil ...