博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017"百度之星"程序设计大赛 - 初赛(B)度度熊的交易计划
阅读量:5062 次
发布时间:2019-06-12

本文共 2498 字,大约阅读时间需要 8 分钟。

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

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

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

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

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 9 int n,m,s,t; 10 #define maxn 10011 11 #define maxm 50011 12 struct Edge{ int from,to,next,cap,flow,cost;}; 13 const int inf=0x3f3f3f3f; 14 struct Graph 15 { 16 Edge edge[maxm]; 17 int n,first[maxn],d[maxn],cur[maxn],le,cost,s,t; 18 bool inq[maxn],mark[maxn]; 19 void clear() {memset(first,0,sizeof(first));le=2;cost=0;} 20 void in(int x,int y,int cap,int cost) 21 { 22 Edge& e=edge[le]; 23 e.from=x;e.to=y;e.cap=cap;e.flow=0; 24 e.cost=cost;e.next=first[x];first[x]=le++; 25 } 26 void insert(int x,int y,int cap,int cost) 27 { 28 in(x,y,cap,cost); 29 in(y,x,0,-cost); 30 } 31 bool SPFA() 32 { 33 memset(d,0x3f,4*(n+1)); 34 int que[233333],head=0,tail=1; 35 que[0]=s;inq[s]=1;d[s]=0; 36 while (head
e.flow && d[e.to]>d[now]+e.cost) 45 { 46 d[e.to]=d[now]+e.cost; 47 if (!inq[e.to]) 48 { 49 que[tail++]=e.to; 50 inq[e.to]=1; 51 if (tail==233333) tail=0; 52 } 53 } 54 } 55 } 56 return d[t]<0; 57 } 58 int dfs(int x,int a) 59 { 60 if (x==t || !a) {cost+=a*d[t];return a;} 61 mark[x]=1; 62 int flow=0,f; 63 for (int& i=cur[x];i;i=edge[i].next) 64 { 65 Edge& e=edge[i]; 66 if (!mark[e.to] && d[e.to]==d[x]+e.cost && (f=dfs(e.to,min(a,e.cap-e.flow)))>0) 67 { 68 flow+=f; 69 e.flow+=f; 70 edge[i^1].flow-=f; 71 a-=f; 72 if (!a) break; 73 } 74 } 75 // mark[x]=0; 76 return flow; 77 } 78 int MCMF(int s,int t) 79 { 80 this->s=s;this->t=t; 81 int flow=0;cost=0; 82 memset(mark,0,sizeof(mark)); 83 memset(inq,0,sizeof(inq)); 84 while (SPFA()) 85 { 86 memset(mark,0,n+1); 87 for (int i=1;i<=n;i++) cur[i]=first[i]; 88 flow+=dfs(s,inf); 89 } 90 return cost; 91 } 92 }g; 93 int a,b,c,d; 94 int main() 95 { 96 while (scanf("%d%d",&n,&m)==2) 97 { 98 g.clear();g.n=n+2;s=n+1;t=s+1; 99 for (int i=1;i<=n;i++)100 {101 scanf("%d%d%d%d",&a,&b,&c,&d);102 g.insert(s,i,b,a);103 g.insert(i,t,d,-c);104 }105 for (int i=1;i<=m;i++)106 {107 scanf("%d%d%d",&a,&b,&c);108 if (a==b) continue;109 g.insert(a,b,inf,c);110 g.insert(b,a,inf,c);111 }112 printf("%d\n",-g.MCMF(s,t));113 }114 return 0;115 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/7354546.html

你可能感兴趣的文章
Mysql与Oracle 的对比
查看>>
MVC系列博客之排球计分(三)模型类的实现
查看>>
npm安装
查看>>
阅读笔记02
查看>>
2019年春季学期第二周作业
查看>>
2014北邮计算机考研复试上机题解(上午+下午)
查看>>
mySQL 教程 第7章 存储过程和函数
查看>>
OGG同步Oracle到Kafka(Kafka Connect Handler)
查看>>
算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)
查看>>
idea的maven项目无法引入junit
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>
页面置换算法-LRU(Least Recently Used)c++实现
查看>>
如何获取Android系统时间是24小时制还是12小时制
查看>>
fur168.com 改成5917电影
查看>>
PHP上传RAR压缩包并解压目录
查看>>
codeforces global round 1题解搬运
查看>>
python os模块
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>