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. 获得select被选中option的value和text

    一:JavaScript原生的方法 1:得到select对象: var myselect=document.getElementById(“test”); 2:得到选中项的索引:var index=m ...

  2. 【经验总结】VS2010下建立MFC程序

    孙鑫的MFC教学视频非常不错,但是由于视频中孙鑫老师采用VC6.0版本,而现在 许多人都转向了使用VS,VS为我们生成了许多不需要的代码,这也导致在这节课的学习编程中总是遇到一些困难.那么,如何去掉这 ...

  3. 洛谷 P1955 程序自动分析

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

  4. Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(一)

    这个地方的生成需要用到三个文件,generatorConfig.xml.mybatis-generator-core-1.3.1.jar和mysql-connector-java-5.1.29.jar ...

  5. C# 递归读取XML菜单数据

    在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据 ...

  6. uva10366 Faucet Flow

    每次找到两边离中心最高的板,如果等,再找外围的最高版...画图便于理解两边先找到距离(-1,1)最近的最大值L和R,因为可能存在多个最高的挡板.接着比较两个L和R的大小,相等的话分别分析两边,取最小值 ...

  7. iview tabs里面放入 i-switch 注意slot不是写在 props里面

    iview tabs里面放入 i-switch 注意slot不是写在 props里面 <Tabs value="name1"> <TabPane :label=& ...

  8. Java中wait()方法为什么要放在同步块中?(lost wake-up 问题)

    问题起源 事情得从一个多线程编程里面臭名昭著的问题"Lost wake-up problem"说起. 这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现. 假 ...

  9. CAD交互绘制样条线(网页版)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...

  10. faster rcnn训练过程讲解

    http://blog.csdn.net/u014696921/article/details/60321425