BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)
题目链接
上下界费用流:
/*
每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少)
然后无源汇可行流 不需要源汇。
注: SS只会连i',求SS->TT的最大流 该走的i->i'是不会不走的
*/
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define gc() getchar()
const int N=850<<1,M=20000,INF=0x3f3f3f3f;
int n,m,A[N],src,des,Enum,H[N],fr[M<<1],to[M<<1],nxt[M<<1],cap[M<<1],cost[M<<1];
int dis[N],pre[N];
bool inq[N];
std::queue<int> q;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v,int w,int c)
{
to[++Enum]=v, nxt[Enum]=H[u], fr[Enum]=u, cap[Enum]=w, cost[Enum]=c, H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], fr[Enum]=v, cap[Enum]=0, cost[Enum]=-c, H[v]=Enum;
}
bool SPFA()
{
memset(dis,0x3f,sizeof dis);
dis[src]=0, q.push(src);
while(!q.empty())
{
int x=q.front();q.pop();
inq[x]=0;
for(int i=H[x];i;i=nxt[i])
if(cap[i] && dis[to[i]]>dis[x]+cost[i])
{
dis[to[i]]=dis[x]+cost[i], pre[to[i]]=i;
if(!inq[to[i]]) inq[to[i]]=1, q.push(to[i]);
}
}
return dis[des]<INF;
}
int MCMF()
{
int mn=INF,res=0;
for(int i=des;i!=src;i=fr[pre[i]])
mn=std::min(mn,cap[pre[i]]);
for(int i=des;i!=src;i=fr[pre[i]])
cap[pre[i]]-=mn,cap[pre[i]^1]+=mn,res+=mn*cost[pre[i]];
return res;
}
int main()
{
Enum=1;
n=read(),m=read();int p=n<<1|1/*中转*/,ss=0,tt=n*2+2;
for(int i=1;i<=n;++i)
{
AddEdge(p,i,1,read()), AddEdge(i+n,p,1,0);
// AddEdge(i,i+n,0,0),//下界-上界后 边cap为0,有没有一样了
AddEdge(ss,i+n,1,0), AddEdge(i,tt,1,0);
}
for(int u,v,w,i=1;i<=m;++i)
{
u=read(),v=read(),w=read();
if(u>v) std::swap(u,v);
if(u==v) continue;
AddEdge(u+n,v,1,w);
}
src=ss, des=tt;
int flow=0;
while(SPFA()) flow+=MCMF();
printf("%d",flow);
return 0;
}
最小路径覆盖:
/*
每个点可以跳到一个点->即每个点可以到S,再从S重新选择新一条路->好像最小路径覆盖
对一条路径u->v建边u->v'(->T),表示可以通过u到过v,但是一共只能经过u一次
移动可以直接S->u'(->T),cost=A[u],表示花费A[u]可以直接走过它
将每个点拆成i,i',连边S->i、i'->T,这样求最大流所有点一定都会经过一次
比上一种方法少2n条边 但比上个..慢些..
cap都是1,优化下 更慢了==
*/
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define gc() getchar()
const int N=850<<1,M=18000,INF=0x3f3f3f3f;
int n,m,A[N],src,des,Enum,H[N],fr[M<<1],to[M<<1],nxt[M<<1],cap[M<<1],cost[M<<1];
int dis[N],pre[N];
bool inq[N];
std::queue<int> q;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v,int c)
{
to[++Enum]=v, nxt[Enum]=H[u], fr[Enum]=u, cap[Enum]=1, cost[Enum]=c, H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], fr[Enum]=v, cap[Enum]=0, cost[Enum]=-c, H[v]=Enum;
}
bool SPFA()
{
memset(dis,0x3f,sizeof dis);
dis[src]=0, q.push(src);
while(!q.empty())
{
int x=q.front();q.pop();
inq[x]=0;
for(int i=H[x];i;i=nxt[i])
if(cap[i] && dis[to[i]]>dis[x]+cost[i])
{
dis[to[i]]=dis[x]+cost[i], pre[to[i]]=i;
if(!inq[to[i]]) inq[to[i]]=1, q.push(to[i]);
}
}
return dis[des]<INF;
}
int MCMF()
{
int res=0;
// for(int i=des;i!=src;i=fr[pre[i]])
// mn=std::min(mn,cap[pre[i]]);
for(int i=des;i!=src;i=fr[pre[i]])
cap[pre[i]]^=1,cap[pre[i]^1]^=1,res+=cost[pre[i]];
return res;
}
int main()
{
Enum=1;
n=read(),m=read();
src=0, des=n<<1|1;
for(int i=1;i<=n;++i)
AddEdge(src,i+n,read()), AddEdge(src,i,0), AddEdge(i+n,des,0);
for(int u,v,w,i=1;i<=m;++i)
{
u=read(),v=read(),w=read();
if(u>v) std::swap(u,v);
if(u==v) continue;
AddEdge(u,v+n,w);
}
int flow=0;
while(SPFA()) flow+=MCMF();
printf("%d",flow);
return 0;
}
BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)的更多相关文章
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=194 题目大意: n个点(n<20000!!!不是200!!!RE了无数次) ...
- ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...
- hdu 4940 Destroy Transportation system (无源汇上下界可行流)
Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 ...
- zoj 2314 Reactor Cooling (无源汇上下界可行流)
Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...
- zoj2314 无源汇上下界可行流
题意:看是否有无源汇上下界可行流,如果有输出流量 题解:对于每一条边u->v,上界high,下界low,来说,我们可以建立每条边流量为high-low,那么这样得到的流量可能会不守恒(流入量!= ...
- ZOJ2314 Reactor Cooling(无源汇上下界可行流)
The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...
- 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情
题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...
- BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]
1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...
- BZOJ 1927: [Sdoi2010]星际竞速
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2051 Solved: 1263[Submit][Stat ...
随机推荐
- NandFlash和iNand
nand 1.nand的单元组织:block与page(大页Nand与小页Nand)(1)Nand的页和以前讲过的块设备(尤其是硬盘)的扇区是类似的.扇区最早在磁盘中是512字节,后来也有些高级硬盘扇 ...
- vue学习生命周期(created和mounted区别)
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图(例如ajax请求列表). mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom ...
- React-Native 之 项目实战(一)
前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...
- elasticsearch5.0.1集群一次误删除kibana索引引发的血案
elasticsearch集群中一次删除kibana索引引发的血案 1.问题发生的过程: 早上的时候有某个索引无法看到报表数据,于是就点该报表多次,估计集群被点挂了,报错:Elasticsearch ...
- 利用pyecharts做地图数据展示
首先, pip install pyecharts 为了地图上的数据能显示完全,加载好需要的城市地理坐标数据. pip install echarts-countries-pypkg pip inst ...
- ThreadLocal和线程同步机制对比
共同点: ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题. 区别: 在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量. 这时该变量是多个线程共享的,使用同 ...
- jquery之源码
1.插件扩展机制 所有的Jquery代理对象的实例,都是扩展自$.fn对象的 意味着只要我们继续扩展$.fn这个对象的功能,就相当于扩展了所有的Jquery代理对象的实例的功能 代码 var $bod ...
- poj2299树状数组入门,求逆序对
今天入门了树状数组 习题链接 https://blog.csdn.net/liuqiyao_01/article/details/26963913 离散化数据:用一个数组来记录每个值在数列中的排名,不 ...
- unittest中更多的测试用例
随着软件功能的不断增加,对应的测试用例也会呈指数级增长.一个实现几十个功能的项目,对应的单 元测试用例可能达到上百个.如果把所有的测试用例都写在一个 test.py 文件中,那么这个文件会越来越臃肿, ...
- C#检查服务状态和启动关闭服务
WinForm 判断服务状态,显示服务名称和状态 https://blog.csdn.net/u013063880/article/details/78626200 C#获得服务,判断服务状态,启动服 ...