洛谷$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 ...
随机推荐
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...
- C. Tokitsukaze and Duel 前缀维护
枚举每一个连续的K的第一个位置,如果是先手胜利,那么前[1 , i-1 ]和[ i+k , n ]区间要么全是0,要么全是1 如果能够平局,那么肯定是[1,i-1],以及[ i+k , n]中有两种情 ...
- oralce 减少访问数据库的次数
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作 ...
- @51nod - 1196/1197/1198@ 字符串的数量
目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @description@ ...
- Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod
Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...
- C#面向对象--练习题
public class Program { //用户自定义:我们自己定义这种数据类型 public struct jiegouti// 结构体前面加上public, 可供外界访问 { public ...
- 极简触感反馈Button组件
一个简单的React触感反馈的button组件 import React from 'react'; import './index.scss'; class Button extends React ...
- Python--day67--include包含其他的url和反向解析URL
1,include包含其他的url: 2,反向解析URL:
- 用diiv实现多个方块居中嵌套--margin
文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...
- pytorch BiLSTM+CRF代码详解 重点
一. BILSTM + CRF介绍 https://www.jianshu.com/p/97cb3b6db573 1.介绍 基于神经网络的方法,在命名实体识别任务中非常流行和普遍. 如果你不知道Bi- ...