博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj千题计划159:bzoj2055: 80人环游世界(有源汇上下界可行最小费用流)
阅读量:7070 次
发布时间:2019-06-28

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

 

某个国家必须经过vi次,

可以转化为上下界都为vi的边

 

对这张图做有源汇上下界可行最小费用流

 按无源汇上下界可行流建好图,跑超级源点到超级汇点的最小费用最大流即可

 

#include
#include
#include
#include
using namespace std; #define N 205#define M 10500 const int inf=1e9; int src,decc;int S,T; int tot=1;int front[N],to[M<<1],nxt[M<<1],cap[M<<1],val[M<<1],from[M<<1]; int cost; int dis[N];bool vis[N]; void read(int &x){ x=0; int f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } x*=f;} void add(int u,int v,int w,int f){ to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u; cap[tot]=w; val[tot]=f; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; from[tot]=v; cap[tot]=0; val[tot]=-f; } int agument(int now,int flow){ vis[now]=true; if(now==T) { cost-=dis[S]*flow; return flow; } int delta; for(int i=front[now];i;i=nxt[i]) { if(cap[i] && !vis[to[i]] && dis[to[i]]==dis[now]+val[i]) { delta=agument(to[i],min(flow,cap[i])); if(delta) { cap[i]-=delta; cap[i^1]+=delta; return delta; } } } return 0;} bool retreat(){ if(vis[T]) return true; int mi=inf; for(int i=2;i<=tot;++i) if(cap[i] && vis[from[i]] && !vis[to[i]]) mi=min(mi,dis[from[i]]+val[i]-dis[to[i]]); if(mi==inf) return false; for(int i=0;i<=T;++i) if(vis[i]) dis[i]-=mi; return true; } void zkw(){ do { memset(vis,false,sizeof(vis)); agument(S,inf); }while(retreat()); cout<

 

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8087597.html

你可能感兴趣的文章
注册和登录还有那个加密的密码
查看>>
【python】-- 面向对象引子、概念
查看>>
Linux下Samba服务配置笔记
查看>>
爬虫学习路线
查看>>
前端总结·基础篇·CSS(三)补充
查看>>
webstorm 快捷键
查看>>
阅读作业总结——《移山之道》
查看>>
缺陷报告的重要组成
查看>>
017_常用API_String类,StringBuffer类和基本数据类型对象包装类
查看>>
EDT改成CST
查看>>
自定义 vim
查看>>
perl 遍历指定目录下的所有文件,替换指定文本内容,返回受影响的文件路径...
查看>>
【转载】CentOS下查看电脑硬件设备属性命令
查看>>
鼠标悬停事件-----提示信息
查看>>
Learning English
查看>>
微博传播数量和传播深度的预测--基于pyspark和某个回归算法
查看>>
cp命令覆盖文件时不用按Y来确认的方法
查看>>
Tomcat优化
查看>>
【开源专访】Sea.js创始人玉伯的前端开发之路
查看>>
前台实现下载xml功能
查看>>