AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

AtCoder Regular Contest 061 E - Snuke’s Subway Trip

problem

洛谷翻译

my idea

最近一直在做网络流,所以一读这题后,我就想到了最小费用流。

首先的问题就是建边问题。

不同线路到达同一个点从而引发后面的费用是相互独立的,不能由同一个点表示。

所以我想到了拆点,把每条边对应的两个点都分别拆出一个虚点,此虚点就代表这条边的颜色。

显然每个点只会拆出与之关联的边不同颜色的个数,而一条边只关联两个点,这最多是 O(n+2m)O(n+2m)O(n+2m) 的。

到目前为止都是可以接受的。

然后就是从一个站点到另一个站点之间的连边,发现如果要把所有情况都包含,必须一个站点的所有拆点都向另一个站点的所有拆点连边,费用为 1/01/01/0。别的不说,这边数就是 O(m2)O(m^2)O(m2) 级别的了。

肯定的,我们非常想把每个站点的拆点都缩成一个虚点。

颜色不同的连虚点费用 111,颜色相同就不管。然而——stuck

solution

将边当作点,正反向边分别建点,建立源汇 s,ts,ts,t

先将原图每个节点 uuu 按照出边的颜色排序,保证相同颜色的出点 vvv 是连续的一段区间。

【以下在新图中连边参与的“点”都是指把边当作点时,边的编号】

  • 正反向边之间连边,费用 000

  • 如果边起点为 111,连边 (s,id,1)(s,id,1)(s,id,1)。因为从 sss 开始就相当于换了公司。

  • 如果 uuu 相同的两条相邻出边 id1,id2id_1,id_2id1,id2 颜色一样,那么相互连边 (id1,id2,0),(id2,id1,0)(id_1,id_2,0),(id_2,id_1,0)(id1,id2,0),(id2,id1,0)

    因为这两条边可以免费走。这样一段连续的相同颜色的边两两之间都可以免费走了。

  • 考虑颜色转化的点,暴力连边如上面是会卡成平方的。

    新建一个虚点,对于 uuu 出边的每种颜色,随便取一条可以代表这种颜色的边向虚点连边 111

    【上一个连边知道了相同颜色的边是两两之间随便走的,所以随便选哪条连虚点都不影响。】

    虚点往这条随便选取的边连边 000

    往虚点走就证明已经换了一家公司,然后虚点走向的点就是换完后代表的公司了。

    如果不走虚点就表示不换公司。

  • 如果边终点为 nnn,连边 (u,t,0)(u,t,0)(u,t,0)

每个点只会建立一个虚点,每条边拆成正反两条边,还有源汇,总点数为 O(n+2m+2)O(n+2m+2)O(n+2m+2)

边数也是差不多级别的。

费用只有 0/10/10/1 之分,而且这个费用可以看作是边权。

0/1 bfs 可以做到线性,但是堆优化 dijkstra 跑个最短路,更板子不用脑一点直接写。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 2000005
#define inf 0x7f7f7f7f
#define Pair pair < int, int >
struct node { int v, c, id; };
vector < node > E[maxn];
vector < Pair > G[maxn];
priority_queue < Pair, vector < Pair >, greater < Pair > > q;
int n, m, s, t;
int dis[maxn], tag[maxn];void dijkstra() {memset( dis, 0x7f, sizeof( dis ) );q.push( { dis[s] = 0, s } );while ( q.size() ) {int u = q.top().second, d = q.top().first; q.pop();if( dis[u] ^ d ) continue;for( int i = 0; i < G[u].size();i ++ ) {int v = G[u][i].first, w = G[u][i].second;if( dis[v] > dis[u] + w ) {dis[v] = dis[u] + w;q.push( { dis[v], v } );}}  }
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v, c;i <= m;i ++ ) {scanf( "%d %d %d", &u, &v, &c );E[u].push_back( { v, c, i << 1 } );E[v].push_back( { u, c, i << 1 | 1 } );}s = 1, t = m * 2 + 2; int tot = t;for( int i = 1;i <= n;i ++ ) {tot ++;sort( E[i].begin(), E[i].end(), []( node x, node y ) { return x.c < y.c; } );for( int j = 0;j < E[i].size();j ++ ) {int k = E[i][j].v, c = E[i][j].c, id = E[i][j].id;if( tag[c] ^ i ) {tag[c] = i;G[tot].push_back( { id, 0 } );G[id].push_back( { tot, 1 } );}G[id].push_back( { id ^ 1, 0 } );if( i == 1 ) G[s].push_back( { id, 1 } );if( k == n ) G[id].push_back( { t, 0 } );if( j and c == E[i][j - 1].c ) G[id].push_back( { E[i][j - 1].id, 0 } ), G[E[i][j - 1].id].push_back( { id, 0 } );}}dijkstra();printf( "%d\n", dis[t] == inf ? -1 : dis[t] );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

HDU5519:Kykneion asma(容斥)

计数的核心是双射。 解析 这也叫数位dp呗… 首先&#xff0c;这个题目的形式很容易令人想到硬币购物&#xff0c;考虑用容斥解决&#xff0c;暴力枚举强制超额的数的集合然后分别计算贡献。 然而&#xff0c;暴力dp计算贡献的复杂度是 O(n2)O(n^2)O(n2) 的。 考虑换一种统计…

Dancing Stars on Me HDU - 5533

Dancing Stars on Me HDU - 5533 题意&#xff1a; LYD又来了&#xff0c;这次他碰到了一个小问题&#xff0c;给定n个点&#xff0c;点的坐标为均为整数&#xff0c;问这些点能否组成正多边形&#xff1f; 题解&#xff1a; 如果是正多边形&#xff0c;那中心的坐标就是所…

[HDU 3625] Examining the Rooms(第一类斯特林数)

Examining the Roomsproblemsolutioncodeproblem hdu 3625 solution 之前考试有一道题&#xff1a;最多砸开 kkk 扇门&#xff0c;采取最有操作&#xff0c;求把 nnn 个门都打开的方案数。 本题稍稍多了一个不能砸开第一扇门的限制&#xff0c;以及求的是概率。 概率好说&…

P5801 [SEERC2019]Game on a Tree(博弈论)

解析 一直在路径可逆上做功夫&#xff0c;跑偏了。 题目可以转化为一个模型&#xff1a;给出一张无向图&#xff0c;每次可以移动到未移动过的点上&#xff0c;不能移动者判负。 这个的做法就是判断是否完美匹配&#xff0c;完美匹配则后手必胜&#xff0c;否则先手必胜。 …

House Building HDU - 5538

House Building HDU - 5538 题意&#xff1a; 有n * m的地方&#xff0c;每个地方都有不同高度的1 * 1的正方形块&#xff0c;相邻块紧密排列&#xff0c;问这些块的表面积是多少&#xff1f; 题解&#xff1a; 对于位置为(i,j)的一个高度为x的块&#xff0c;他的测表面积为…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖&#xff0c;但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开&#xff0c;可读性会好一些。本文将编写一个类型&#xff0c;可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…

【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

P3426 [POI2005]SZA-Template(kmp、dp)

解析 做出来了就是胜利&#xff01; 个人感觉虽然我这个nxt树的码量会大一点&#xff0c;但是思路其实比较自然。&#xff08;看题解区也有&#xff09; 也是一个相当可取的做法。 现在来讲讲巧妙的dp做法。 考虑直接嗯设&#xff1a;fif_ifi​ 表示覆盖 [1,i][1,i ][1,i] 的…

为什么我的会话状态在ASP.NET Core中不工作了?

原文&#xff1a;Why isnt my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies作者&#xff1a;Andrew Lock译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10526380.html译者&#xff1a;Lamond Lu在本篇博客中&#xff0c;我将…

Jury Compromise POJ - 1015

Jury Compromise POJ - 1015 题意&#xff1a; 在遥远的国家佛罗布尼亚&#xff0c;嫌犯是否有罪&#xff0c;须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人&#xff0c;然后再从这n个人中选m人组成陪审团。选m人的办法是&#xff1a; 控…

叁仟柒佰万(mex+线段树+dp+前缀和优化+双指针+桶)

叁仟柒佰万problemsolutioncode(50’)code(90’)code(100’)problem 多组数据。 给定一个序列 aaa&#xff0c;你可以将它划分成任意多段&#xff0c;满足每一个段的 mex 相同。 求方案数&#xff0c;对 109710^971097 取模。 T≤10,n≤3e5T\le 10,n\le 3e5T≤10,n≤3e5。 …

模板:吉司机线段树

所谓吉司机线段树&#xff0c;就是吉司机种的线段树 &#xff08;逃&#xff09; 解析 之前也看过一些相关内容的博客&#xff0c;但是因标记乱七八糟&#xff0c;感觉过于高深而放弃了… 直到看到洛谷这篇博客&#xff0c;完全颠覆了我的认知。&#xff08;怎么感觉语气像营…

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化&#xff0c;俗话说的好&#xff0c;一切脱离业务的架构都是耍流氓&#xff0c;接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自…

Help Jimmy POJ - 1661

Help Jimmy POJ - 1661 题意&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是最低的平台&#xff0c;高度为零&#xff0c;长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落&#xff0c;它的下落速度始终为1米/秒。当Jimmy落到某个平台上时&#xff0c…

[HDU 6643] Ridiculous Netizens(点分治+根号分治+dp)

HDU 6643 Ridiculous Netizens problem hdu6643 题目大意&#xff1a;给定一棵无根树&#xff0c;以及每个点的点权 wiw_iwi​。 定义一个连通块的价值为连通块内点的点权之积。 求有多少个连通块价值 ≤m\le m≤m。 n≤2e3,m≤1e6n\le 2e3,m\le 1e6n≤2e3,m≤1e6。 solu…

SP422 TRANSP2 - Transposing is Even More Fun(Burnside引理,莫比乌斯反演)

解析 很巧妙的题。 关键是要利用好边长为2的整数次幂的性质。 对下标从1开始党极不友好。 首先显然答案就是 2ab2^{ab}2ab -环。 让下标均从0开始。 对于一个点 (i,j)(i,j)(i,j)&#xff0c;它原来的内存地址为 i∗2aji*2^aji∗2aj&#xff0c;转置后的地址为 j∗2bij*2^bij∗…

Fireworks(2020 ICPC南京)

Fireworks 题意&#xff1a; 你每做一个烟花要n分钟&#xff0c;释放已做好的所有烟花需要m分钟&#xff0c;每只烟花成功释放的概率为p。问你在采取最优策略的前提下&#xff0c;直到成功释放第一个烟花时最小的期望时间花费。 题解&#xff1a; 最佳策略是&#xff1a;每…

ASP.NET Core 沉思录 - ServiceProvider 的二度出生

ASP.NET Core 终于将几乎所有的对象创建工作都和依赖注入框架集成了起来。并对大部分的日常工作进行了抽象。使得整个框架扩展更加方便。各个部分的集成也更加容易。今天我们要思考的部分仍然是从一段每一个工程中都大同小异的代码开始的。IWebHostBuilder CreateWebHostBuilde…

[SPOJ - FTOUR2] Free tour II(点分治 + 背包dp + 启发式合并)

SPOJ - FTOUR2 Free tour II problem 给定一棵树&#xff0c;以及 mmm 个拥挤城市编号&#xff0c;选择一条最多包含 kkk 个拥挤城市的简单路径。 每条边有一个有趣度 www&#xff0c;可正可负。简单路径的价值定义为包含边的有趣度之和。 求最大价值。n≤2e5,∣w∣≤1e4n\…