题面

​ 巨佬一眼就能看出这是最小路径覆盖, 我这个蒟蒻还是太弱了...

​ 我们可以知道跳跃值为点权w[i], 两点之间距离为边权ww

​ 对于每个点, 在最小路径覆盖问题中, 假设每个点都是一条路径, 即每个点都由能力爆发得到, 那么最初的答案便是\(ans\) = \(\sum_{ i = 1}^{n}\), 对于每一条连接u和v的边, 可以看做不使用能力爆发而从u往v走, 那么我们就减少了点v的点权, 加上了这一条边的代价, 即从\(min(u, v)\)向\(max(u, v)\)连一条容量为1, 费用为\(ww - w[v]\), 那么只要每次增广找到一条费用为负的边就可以减少总时间, 即当\(d[T]\)小于0时就可以将\(ans += d[T]\), 所以, 只要当此次增广无法到达T或者\(d[T]\) > 0时就可以return 0了.

具体代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define N 5005
using namespace std; int n, m, S, T, head[N], cnt = 1, p[N], vis[N], w[N];
struct node
{
int from, to, next;
long long flow, cost;
} edge[100005];
long long a[N], d[N], ans; inline int read()
{
int x = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
} inline void add(int u, int v, int w, int cost)
{
edge[++cnt] = { u, v, head[u], w, cost }; head[u] = cnt;
edge[++cnt] = { v, u, head[v], 0, -cost }; head[v] = cnt;
} bool SPFA()
{
memset(d, 0x3f, sizeof(d)); memset(a, 0x3f, sizeof(a));
queue<int> q; q.push(S); d[S] = 0;
while(!q.empty())
{
int u = q.front(); q.pop(); vis[u] = 0;
for(int i = head[u]; i; i = edge[i].next)
{
int v = edge[i].to;
if(d[v] > d[u] + edge[i].cost && edge[i].flow > 0)
{
d[v] = d[u] + edge[i].cost; a[v] = min(a[u], edge[i].flow);
p[v] = i; if(!vis[v]) { vis[v] = 1; q.push(v); }
}
}
}
if(d[T] == d[0] || d[T] > 0) return 0;
if(d[T] < 0) ans += (d[T] * a[T]);
for(int i = T; i != S; i = edge[p[i]].from)
{
edge[p[i]].flow -= a[T]; edge[p[i] ^ 1].flow += a[T];
}
return 1;
} int main()
{
n = read(); m = read(); S = 2 * n + 1; T = S + 1;
for(int i = 1; i <= n; i++) { w[i] = read(); ans += w[i]; add(S, i, 1, 0); }
for(int i = 1; i <= n; i++) add(i + n, T, 1, 0);
for(int i = 1; i <= m; i++)
{
int u = read(), v = read(), ww = read();
if(u > v) swap(u, v);
add(u, v + n, 1, ww - w[v]);
}
while(SPFA());
printf("%lld\n", ans);
return 0;
}

[luogu2469] 星际竞速的更多相关文章

  1. BZOJ 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2051  Solved: 1263[Submit][Stat ...

  2. 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2040  Solved: 1257[Submit][Stat ...

  3. BZOJ-1927 星际竞速 最小费用最大流+拆点+不坑建图

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 1593 Solved: 967 [Submit][Statu ...

  4. C++之路进阶——codevs2313(星际竞速)

    2313 星际竞速 2010年省队选拔赛山东  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 10 年一度的银河系 ...

  5. bzoj1927: [Sdoi2010]星际竞速

    跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  6. BZOJ 1927: [Sdoi2010]星际竞速 费用流

    1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1576  Solved: 954[Submit][Statu ...

  8. BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)

    拆点,费用流... ----------------------------------------------------------------------------- #include< ...

  9. BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]

    1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...

随机推荐

  1. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  2. 如何让企业邮箱更安全之gmail yahoo hotmail 反垃圾邮件机制

    一.雅虎.Gmail Domainkeys 是由雅虎公司推出的一项确保电子邮件来源的真实性和内容的完整性的技术,它能让电子邮件服务商确定某封信是否真实的来自某个域和帮助他们的用户免受“钓鱼欺诈邮件“的 ...

  3. Redis哨兵(sentinel)模式搭建

    一.Sentinel介绍 之前骚了一波Redis的简介及应用场景,今天试了下他的哨兵模式: Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentine ...

  4. Linux安装redis和部署

    第一步:下载安装包 访问https://redis.io/download  到官网进行下载.这里下载最新的4.0版本. 第二步:安装 1.通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压 ...

  5. Mybatis一对一,一对多

    一对一 假如有student表(学生表)和student_card表(学生证表). student表中有一个字段self_card用来查student_card,student_card表中有一个st ...

  6. NIO,AIO,BIO

    同步和异步:同步和异步关注的是消息通信机制, 同步:就是在发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,但是一旦调用返回,就得到返回值了;换句话说:就是由“调用者”主动等待“调用”结果 ...

  7. php面向对象高级-魔术方法与迭代器

    1,魔术方法__set与__get, __call >这些魔术方法,将在相关的属性或者方法不存在时调用 >函数原型 .function __set( $property, $value ) ...

  8. 转 [PHP] - 性能加速 - 开启Opcache

    原文地址:[PHP] - 性能加速 - 开启Opcache PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升  一.开启Opc ...

  9. 如何使用Ubuntu中的avdManager命令行为“System-Image;Androd-27;GoogleAPI;x86”创建一个AVD?

    命令是正确的,但问题是在你的系统中,你没有“android-27”操作系统. 请检查你的系统中有哪个操作系统,进入下面的目录 目录路径:-~\Android\SDK\Platform 如果没有,请先下 ...

  10. android踩坑记录之view.setVisiblity()

    问题 在某次做悬浮侧边栏的时候,遇到了一个问题:我用windowManager创建的悬浮侧边栏.点击中心view展开菜单,再次点击则隐藏菜单,如此简单的一个需求,却遇到了奇怪的问题,我没有对view的 ...