洛谷$P2469\ [SDOI2010]$ 星际竞速 网络流
正解:网络流
解题报告:
题目好长昂,,,大概概括下就说有$m$条单向边,$n$个点,每条边有一条边权,每个点有一个点权,然后问每个点都要到达一遍的最小代价是多少$QwQ$?
发现有两个要求,一个是每个点恰好经过一次,一个是代价最小,不显然考虑最小费用最大流,,,?
考虑拆点呗,先给源点和入点,出点和汇点分别连上流量为1费用为0的边,然后对于跳跃操作,就给源点和出点连上流量为1费用为$a_i$的边;对于航道$(x,y)$,就从$x$的入点连向$y$的出点,$over$
昂正确性可以理解成类似于最小割的亚子,,,?
就首先每个点要么是跳过去要么是通过路走过去.
但是如果直接和$S$连路的代价$T$连跳的代价也布星,因为这样就不能保证每个点只被经过一次?就感性理解下,如果切断了两条边,但是这两条边的起点是一样的,这显然是布星的(因为每个点只能被经过一次鸭$QwQ$.
所以就考虑拆点,这样就能保证每个点最多被经过一次了$QwQ$
当然辣最后建图肯定和最小割还是有点儿差别的,,,毕竟一个费用流一个最大流显然还是不一样的鸭$QwQ$.
但我的理解来说大致思想是差不多的所以我就用最小割解释了下$QwQ$
实在不理解的自己画个图就好?$QwQ$
- #include<bits/stdc++.h>
- using namespace std;
- #define il inline
- #define gc getchar()
- #define t(i) edge[i].to
- #define w(i) edge[i].wei
- #define fy(i) edge[i].fy
- #define ri register int
- #define rc register char
- #define rb register bool
- #define rp(i,x,y) for(ri i=x;i<=y;++i)
- #define my(i,x,y) for(ri i=x;i>=y;--i)
- #define e(i,x) for(ri i=head[x];~i;i=edge[i].nxt)
- const int N=+,M=+;
- int n,m,ed_cnt=-,head[N],dis[N],fr_ed[N],fr_nod[N],S,T,as;
- bool vis[N];
- struct ed{int to,nxt,wei,fy;}edge[M<<];
- il int read()
- {
- rc ch=gc;ri x=;rb y=;
- while(ch!='-' && (ch>'' || ch<''))ch=gc;
- if(ch=='-')ch=gc,y=;
- while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
- return y?x:-x;
- }
- il void ad(ri x,ri y,ri z,ri p)
- {edge[++ed_cnt]=(ed){x,head[y],z,p};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],,-p};head[x]=ed_cnt;}
- il bool spfa()
- {
- queue<int>Q;Q.push(S);memset(vis,,sizeof(vis));memset(dis,,sizeof(dis));vis[S]=;dis[S]=;
- while(!Q.empty())
- {
- ri nw=Q.front();Q.pop();vis[nw]=;
- e(i,nw)
- if(w(i) && dis[t(i)]>dis[nw]+fy(i))
- {dis[t(i)]=dis[nw]+fy(i);fr_ed[t(i)]=i;fr_nod[t(i)]=nw;if(!vis[t(i)])Q.push(t(i)),vis[t(i)]=;}
- }
- if(dis[T]==dis[T+])return ;
- ri flow=dis[T+];
- for(ri i=T;i!=S;i=fr_nod[i])flow=min(flow,w(fr_ed[i]));
- for(ri i=T;i!=S;i=fr_nod[i])w(fr_ed[i])-=flow,w(fr_ed[i]^)+=flow;
- as+=flow*dis[T];return ;
- }
- int main()
- {
- //freopen("2469.in","r",stdin);freopen("2469.out","w",stdout);
- n=read();m=read();S=;T=n<<|;memset(head,-,sizeof(head));rp(i,,n)ad(i,S,,),ad(T,i+n,,);
- rp(i,,n)ad(i+n,S,,read());rp(i,,m){ri x=read(),y=read();if(x>y)swap(x,y);ad(y+n,x,,read());}
- while(spfa());printf("%d\n",as);
- return ;
- }
洛谷$P2469\ [SDOI2010]$ 星际竞速 网络流的更多相关文章
- 洛谷 P2469 [SDOI2010]星际竞速 解题报告
题目描述 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一. 赛车大赛的赛场由N颗行星和M条双向星际航路构成,其 ...
- P2469 [SDOI2010]星际竞速(费用流)
P2469 [SDOI2010]星际竞速 最小路径覆盖问题 每个星球必须恰好去一次,而每次高速航行都是从一个星球到另一个星球. 那么高速航行的起点可以保证被去过 高速航行和空间跳跃可以是互相独立的 将 ...
- Bzoj 1927: [Sdoi2010]星际竞速(网络流)
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大 ...
- 洛谷$P3324\ [SDOI2015]$星际战争 网络流+二分
正解:网络流+二分 解题报告: 传送门$QwQ$ 其实我第一反应是费用流来着,,,但是仔细想了下发现我不会实现各个武器之间独立同时?而且攻击是连续的答案可能是小数嘛$QwQ$. 所以显然不是递推就二分 ...
- P2469 [SDOI2010]星际竞速
在何Au的讲解下终于搞明白了这个以前的坑. 首先考虑最小路径覆盖. 这个题意又要求我们求出的最大流为n-1(这样才能保证路径为1条) 考虑高速航行模式的图怎么建,只需要保证最大流的同时费用最小即可,显 ...
- bzoj 1927 [Sdoi2010]星际竞速——网络流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1927 每个点拆点保证只经过一次. 主要是如果经过了这个点,这个点应该向汇点流过去表示经过了它 ...
- Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)
Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...
- BZOJ 1927: [Sdoi2010]星际竞速
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2051 Solved: 1263[Submit][Stat ...
- BZOJ1927 [Sdoi2010]星际竞速 【费用流】
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 2582 Solved: 1601 [Submit][St ...
随机推荐
- Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(二)
Creating trace with system stored procedures Following are the stored procedures which you should kn ...
- oracle函数 NEW_TIME(dt1,c1,c2)
[功能]:给出时间dt1在c1时区对应c2时区的日期和时间 [参数]:dt1,d2 日期型 [返回]:日期时间 [参数]:c1,c2对应的 时区及其简写 大西洋标准时间:AST或ADT 阿拉斯加_夏威 ...
- 模板—Kruskal
int getf(int x){return (f[x]==x)?x:f[x]=getf(f[x]);} void hb(int x,int y){x=getf(x),y=getf(y),f[y]=x ...
- oracle总是使用索引的第一个列
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按: 这也是一条简单而重要的规则. 见以下实例. SQL> ...
- PyTorch官方中文文档:torch.optim 优化器参数
内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...
- H3C PPP基本概念
- [转]在ASP.NET WebAPI 中使用缓存【Redis】
初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...
- PHP性能监控
使用xhprof进行线上PHP性能追踪及分析 日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. 之前一直使用基于Xdebug进行PHP的性 ...
- linux 共享队列
一个设备驱动, 在许多情况下, 不需要它自己的工作队列. 如果你只偶尔提交任务给队列, 简单地使用内核提供的共享的, 缺省的队列可能更有效. 如果你使用这个队列, 但是, 你 必须明白你将和别的在共享 ...
- JS 逻辑运算符 ||、 &&, 位运算符 |、&
1.JS中的||符号: 运算方法: 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值. 只要“||”前面为true,不管“||”后面是true还是fals ...