BZOJ2055 80人环游世界
上下界最小费用流
限制点访问量->拆点[i,i']
建图:
1.s->S [m,m] 0
2.S->i [0,inf] 0 i'->t [0,inf] 0
3.i‘-j [0,inf] x
4.i->i'[vi,vi] 0
然后就是上下界流的常见套路啦
根据“调整”原则 先是每个点点权为di=ini-outi 然后>0的连源点 <0的连汇点
然后循环流原始源点和汇点连边 由于这个题每条限制边都是卡紧的所以不需要再往回跑一次
接下来就是喜闻乐见的dinic解决啦
//Love and Freedom. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define inf 20021225 #define ll long long #define M 100010 #define N 210 using namespace std;struct edge{int to,lt,f,c,fm;}e[M<<1]; int in[N],cnt=1,S,t,ss,s,tt,from[N]; void add(int x,int y,int f,int c) {e[++cnt].to=y;e[cnt].fm=x;e[cnt].lt=in[x];e[cnt].f=f;e[cnt].c=c;in[x]=cnt;e[++cnt].to=x;e[cnt].fm=y;e[cnt].lt=in[y];e[cnt].f=0;e[cnt].c=-c;in[y]=cnt; } queue<int> q; int dis[N]; bool vis[N]; bool spfa() {while(!q.empty()) q.pop();memset(from,0,sizeof(from)); memset(vis,0,sizeof(vis));memset(dis,48,sizeof(dis)); dis[ss]=0; vis[ss]=1; q.push(ss);while(!q.empty()){int x=q.front(); q.pop();for(int i=in[x];i;i=e[i].lt){int y=e[i].to; if(e[i].f&&dis[y]>dis[x]+e[i].c){dis[y]=dis[x]+e[i].c; from[y]=i;if(!vis[y]) vis[y]=1,q.push(y);//if(y==tt) return 1; }}vis[x]=0;}return dis[tt]!=dis[0]; } int flow() {int f=inf;for(int i=tt;i!=ss;i=e[from[i]].fm) f=min(f,e[from[i]].f);for(int i=tt;i!=ss;i=e[from[i]].fm) e[from[i]].f-=f,e[from[i]^1].f+=f;return dis[tt]*f; } int d[N],n,v[N]; int ans; int main() {int m;int x;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&v[i]);d[i]-=v[i]; d[i+n]+=v[i];}S=n<<1|1; s=S+1; t=s+1; ss=t+1; tt=ss+1;// tt=ss+1;d[s]-=m; d[S]+=m;for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++){scanf("%d",&x); if(x==-1) continue;add(i+n,j,inf,x);}for(int i=1;i<=n;i++) add(S,i,inf,0),add(i+n,t,inf,0);for(int i=1;i<=S;i++){if(d[i]>0) add(ss,i,d[i],0);if(d[i]<0) add(i,tt,-d[i],0);}add(t,s,inf,0); while(spfa()) ans+=flow();printf("%d\n",ans);return 0; }
View Code
转载于:https://www.cnblogs.com/hanyuweining/p/10385838.html
BZOJ2055 80人环游世界相关推荐
- [bzoj2055]80人环游世界 上下界费用流
2055: 80人环游世界 Time Limit: 10 Sec Memory Limit: 64 MB [ Submit][ Status][ Discuss] Description 想必大家 ...
- [bzoj2055]80人环游世界[网络流,上下界网络流]
手动画了整张图,,算是搞懂了吧,, 1 #include <bits/stdc++.h> 2 3 #define INF 0x3f3f3f3f 4 5 using namespace st ...
- BZOJ 2055: 80人环游世界 [上下界费用流]
2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...
- 2055: 80人环游世界
2055: 80人环游世界 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 366 Solved: 232 [ Submit][ Status][ ...
- BZOJ 2055: 80人环游世界 有源汇上下界费用流
2055: 80人环游世界 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 568 Solved: 347 [Submit][Status][Disc ...
- 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)
题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai,ai+n一个点为入点,一个为出点这条边的流量范围 ...
- 搞事情 | 大数据文摘和ta的朋友们:环游世界的80天
2017年 大数据文摘收获了 500+位新的志愿者, 7月份,我们在宇宙中心 举办了夏季狂欢Concert 在北京和超过200位真爱 面对面喝了一杯 2018年 文摘菌也想要对那些 分布在全球各地 毫 ...
- 为什么朋友圈总有些环游世界的人? 可能大部分是...
转载公号: 差评 | 编辑: 猫咪 国庆放假7天, 刷朋友圈还挺有意思的.虽然宅在家里7天,不过却从朋友圈看到了整个世界的风景,你说厉害吧!比如下面几个: 可以了解到成都哪家蹄花好吃. 以及,足不出户 ...
- 朋友圈那些环游世界的人,可能只花了100块。。。
点击上方"民工哥技术之路"选择"星标" 每天10点为你分享不一样的干货 本文经授权转自差评公众号,如需转载请联系官方授权. 大家一天会刷几次朋友圈? 小辣椒 ...
最新文章
- 运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常
- 机房系统(九)——【组合查询】
- asp.net MVC 应用程序的生命周期
- java 1.6 ubuntu_ubuntu配置 Java SE 1.6
- RabbitMQ保姆级教程
- bootstrape实战案例_bootstrap 实战入门教程(一)
- Maven(4)--- 构建生命周期
- ASP基础教程:数据库查询语言(2)
- 数据科学即将迎来“无代码”时代
- 如何下载vSphere Big Data Extensions 1.0免费试用版
- Java通过微信公众号获取地理位置信息
- 同济大学 线性代数 第六版 pdf_线性代数同济第六版第五章课后习题答案!
- Word无法插入页码怎么办?Word页码选项变灰,无法使用解决方法
- 在ie edge中消除默认出现的密码框小眼睛标志
- Python技法-序列拆分
- winform listbox控件简单使用。
- docker中konga的安装
- 《云计算网络珠玑》新书有奖试读活动
- SM8S36CA-汽车TVS瞬态抑制二极管
- 使用开源免费的shotcut 做视频编辑功能,和视频合并功能。感觉上和mac上面的imove 类似。开源项目星星比较多。