n个村庄m条带权路,权值为花费,村庄可以造东西卖东西,造完东西可以换地方卖,给出每个村庄造东西花费a和最多个数b、卖东西价值c和最多个数d,求最大收益。

裸的费用流。然而还WA了一发。很好。

建源向每个村庄连边(b,a),(b,a)表示容量b费用a,每个村庄向汇点连边(d,-c),村庄间有路就互相连边(inf,v),v为边权,然后就是最小费用流。

不是最小费用最大流!!把费用最大流SPFA中最后一句判断改成<0即可,因为>=0时的费用可以不要他。

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
using namespace std; int n,m,s,t;
#define maxn 10011
#define maxm 50011
struct Edge{int from,to,next,cap,flow,cost;};
const int inf=0x3f3f3f3f;
struct Graph
{
Edge edge[maxm];
int n,first[maxn],d[maxn],cur[maxn],le,cost,s,t;
bool inq[maxn],mark[maxn];
void clear() {memset(first,,sizeof(first));le=;cost=;}
void in(int x,int y,int cap,int cost)
{
Edge& e=edge[le];
e.from=x;e.to=y;e.cap=cap;e.flow=;
e.cost=cost;e.next=first[x];first[x]=le++;
}
void insert(int x,int y,int cap,int cost)
{
in(x,y,cap,cost);
in(y,x,,-cost);
}
bool SPFA()
{
memset(d,0x3f,*(n+));
int que[],head=,tail=;
que[]=s;inq[s]=;d[s]=;
while (head<tail)
{
const int now=que[head++];
if (head==) head=;
inq[now]=;
for (int i=first[now];i;i=edge[i].next)
{
Edge& e=edge[i];
if (e.cap>e.flow && d[e.to]>d[now]+e.cost)
{
d[e.to]=d[now]+e.cost;
if (!inq[e.to])
{
que[tail++]=e.to;
inq[e.to]=;
if (tail==) tail=;
}
}
}
}
return d[t]<;
}
int dfs(int x,int a)
{
if (x==t || !a) {cost+=a*d[t];return a;}
mark[x]=;
int flow=,f;
for (int& i=cur[x];i;i=edge[i].next)
{
Edge& e=edge[i];
if (!mark[e.to] && d[e.to]==d[x]+e.cost && (f=dfs(e.to,min(a,e.cap-e.flow)))>)
{
flow+=f;
e.flow+=f;
edge[i^].flow-=f;
a-=f;
if (!a) break;
}
}
// mark[x]=0;
return flow;
}
int MCMF(int s,int t)
{
this->s=s;this->t=t;
int flow=;cost=;
memset(mark,,sizeof(mark));
memset(inq,,sizeof(inq));
while (SPFA())
{
memset(mark,,n+);
for (int i=;i<=n;i++) cur[i]=first[i];
flow+=dfs(s,inf);
}
return cost;
}
}g;
int a,b,c,d;
int main()
{
while (scanf("%d%d",&n,&m)==)
{
g.clear();g.n=n+;s=n+;t=s+;
for (int i=;i<=n;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
g.insert(s,i,b,a);
g.insert(i,t,d,-c);
}
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if (a==b) continue;
g.insert(a,b,inf,c);
g.insert(b,a,inf,c);
}
printf("%d\n",-g.MCMF(s,t));
}
return ;
}

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. Oracle、MySQL和SqlServe分页查询的语句区别

    ★先来定义分页语句将要用到的几个参数: int currentPage ; //当前页 int pageRecord ; //每页显示记录数 以之前的ADDRESSBOOK数据表为例(每页显示10条记 ...

  2. 复习-PEP8规范(转)

    PEP8 Python 编码规范 一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换 ...

  3. C#处理Android Audio and Video

    Video Converter for .NET (C#) FFMpeg wrapper http://www.nrecosite.com/video_converter_net.aspx Docum ...

  4. 纯手写的css3正方体旋转效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. MongoDB最简单的入门教程之一 环境搭建

    MongoDB是近年来非常流行的一个介于关系数据库和非关系数据库之间的解决方案,特别广泛地应用于国内很多互联网公司,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB支持的数据结构非常松 ...

  6. Unity3D windows平台视频录制录屏插件 UnityRecorder

    例子:从官方例子简单改了 using UnityEditor;using UnityEditor.Recorder;using UnityEditor.Recorder.Input;using Sys ...

  7. Python中Pickle模块的dump()方法和load()方法

    Python中的Pickle模块实现了基本的数据序列与反序列化. 经常遇到在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就 ...

  8. String s = “1a2a3a4a” 解码为 “1234”

    将字符串 String s = “1a2a3a4a”  解码为 “1234” public class Program2 { public static void main(String[] args ...

  9. Omnidirectional DSO: Direct Sparse Odometry with Fisheye Cameras 论文摘要

    1. Abstract 通过一种Unified Omnidirectional Model作为投影方程. 这种方式可以使用图像的所有内容包括有强畸变的区域,而现存的视觉里程计方案只能修正或者切掉来使用 ...

  10. pm2 start命令进阶详解

    在node的世界里面,并不存在nginx或者apache,甚至tomcat这种东东.一个node,本身就用几行代码,就可以启动个server进程,监听个端口,为大家提供web服务.这和传统的网站代码的 ...