2017"百度之星"程序设计大赛 - 初赛(B)度度熊的交易计划
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)度度熊的交易计划的更多相关文章
- 2017"百度之星"程序设计大赛 - 资格赛 1002 度度熊的王国战略
全局最小割 Stoer-Wagner (SW算法)优化 优化吃藕了,感谢放宽时限,感谢平板电视 (pb_ds) #include <iostream> #include <cstdi ...
- HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017"百度之星"程序设计大赛 - 初赛(B))
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 6109 数据分割 【并查集+set】 (2017"百度之星"程序设计大赛 - 初赛(A))
数据分割 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 6108 小C的倍数问题 【数学】 (2017"百度之星"程序设计大赛 - 初赛(A))
小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 6122 今夕何夕 【数学公式】 (2017"百度之星"程序设计大赛 - 初赛(A))
今夕何夕 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 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"百度之星 ...
- [SinGuLaRiTy] 2017 百度之星程序设计大赛 初赛B
[SinGuLaRiTy-1037] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Chess Time Limit: 2000/1000 ...
随机推荐
- AJPFX总结Collection集合(上)
出现集合类的原因 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一个方式. 数组和集合都是容器有何不同? 数组虽也可存储对象,但长度 ...
- hdu1513 Palindrome
思路: dp+滚动数组. 实现: #include <iostream> #include <cstdio> #include <string> #include ...
- CSS进阶:提高你前端水平的 4 个技巧
译者注:随着 Node.js .react-native 等技术的不断出现,和互联网行业的创业的层出不穷,了解些前端知识,成为全栈攻城师,快速的产出原型,展示你的创意,对程序员,尤其是在创业的程序员来 ...
- php 缓存工具类 实现网页缓存
php 缓存工具类 实现网页缓存 php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存 一.文件缓存 二.数据查询结果缓存,使用内存来实现高速缓存 本 ...
- CPLD
复杂可编程逻辑器件(Complex Programmable Logic Device, CPLD),CPLD适合用来实现各种运算和组合逻辑(combinational logic).一颗CPLD内等 ...
- Javaweb学习笔记4—Reuest&Response
今天来讲javaweb的第四段学习. Request和Response还是比较重要的 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣 ...
- HDU 5416 CRB and Tree (技巧)
题意:给一棵n个节点的树(无向边),有q个询问,每个询问有一个值s,问有多少点对(u,v)的xor和为s? 注意:(u,v)和(v,u)只算一次.而且u=v也是合法的. 思路:任意点对之间的路径肯定经 ...
- ES6对象和数组解构
解构可以避免在对象赋值时再生成多余的中间变量: function foo() { return [1,2,3]; } let arr = foo(); // [1,2,3] let [a, b, c] ...
- [SNOI2019]数论
题目 考虑对于每一个\(a_i\)计算有多少个\(0<x\leq T-1\)满足\(x\equiv a_i(mod\ P)\)且\(x\ mod\ Q \in B\) 显然\(x=a_i+k\t ...
- springmvc请求方法那些事
@RequestMapping 用法详解之地址映射 (2013-08-11 16:06:58) 转载▼ 标签: it 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式 ...