首页 > 其他分享 >交通运输(Wormhole Transportaion) 题解

交通运输(Wormhole Transportaion) 题解

时间:2023-05-16 22:25:13浏览次数:46  
标签:cnt Transportaion Wormhole 题解 路径 times le 答案 我们

传送门

交通运输(Wormhole Transportaion)

题目大意

有 \(n\) 个点和 \(m\) 个点对,你需要构造一张 \(m-1\) 条边的无向图,使得 \(m\) 个点对间最短路之和最小。

最小值及取到最小值的方案数

\(2 \le n \le 2000,2 \le nm \le 2 \times 10^7,1 \le u_i,v_i \le n,u_i \neq v_i\)。

保证所有无序对 \((u_i,v_i)\) 两两不同,且至少存在一种合法的方案

subtask \(n \le\) 特殊限制
\(1\) \(6\)
\(2\) \(2000\) \(m=n\),\(u_i=i,v_i=(i \bmod n) + 1\)
\(3\) \(2000\) 由 \((u_i,v_i)\) 为无向边的图是仙人掌森林
\(4\) \(2000\) 由 \((u_i,v_i)\) 为无向边的图是杏仁
\(5\) \(300\) \(m \le 1000\)
\(6\) \(2000\)

仙人掌森林:每条边在至多一个简单环中的无向图。

杏仁:恰好存在两个度数大于 \(2\) 的结点,其他结点度数都等于 \(2\),且所有环都经过两个度数大于 \(2\) 的结点的连通无向图。

思路

称以 \((u_i,v_i)\) 为无向边的图为 \(G\),我们构造的图为 \(G'\)

定义 “删去” 表示这条边或路径在 \(G\) 中,但不在 \(G'\) 中。“保留” 表示这条边或路径既在 \(G\) 中也在 \(G'\) 中

令 \(d(u,v)\) 表示在 \(G'\) 中 \(u\) 到 \(v\) 的最短路


求解最短路最小值

题目中保证至少存在一种合法的方案,那么我们可以知道,\(G\) 中一定有环。

若 \(G\) 中无环,那么 \(G\) 就是普通森林,对于任意森林里的一棵树 \(T\),令其有 \(k\) 条边,\(k+1\) 个节点。

由于 \(T\) 有 \(k+1\) 个节点,所以我们要使其连通至少需要 \(k\) 条边。那么我们所需的总边数为 \(m\),大于题目要求的 \(m-1\),所以不存在合法方案,矛盾。

那么我们就可以猜测,最短路最小值与环有关。

设环内边数量为 \(x\)


先考虑环外的边。

1.1

我们观察不在 \(G\) 的环上的边 \((5,6)\)。

假设我们选择了一个中转点进行连边。

可以发现,如果我们选择一个不在 \(G\) 中的中转点 \(7\),那么我们会连接 \((5,7),(6,7)\) 两条边,\(d(5,6)=2\),使用两条边。但实际上我们可以连接 \((5,6)\),此时 \(d(5,6)=1\) 且只使用了一条边。

所以,我们不会选择不在 \(G\) 中的节点作中转。

同样的,如果我们选择一个在 \(G\) 中的中转点 \(2\),那么我们会连接 \((2,5),(2,6)\) 两条边,\(d(5,6)+d(2,6)=3\),使用两条边。但如果我们连接 \((5,6),(2,6)\),\(d(5,6)+d(2,6)=2\),同样使用两条边。

所以,我们不会选择在 \(G\) 中的节点作中转。

综上,我们不会作中转。

也就是说,如果 \((u,v) \in G\),且 \((u,v)\) 不是环边,那么 \((u,v) \in G'\)

根据这条性质,我们可以知道,环外的边的答案就是 \(m-x\)。


接下来考虑环内的边。

1.2

我们假设这个环长度为 \(k\)。

显然,如图所示将环断成一条链最优。答案为 \(2 \times (k - 1)\)。

那如果有多个环?显然我们只需断一个环。而又因为我们要让答案最小,即选择一个环 \(i\) 使 \(2 \times (k_i - 1)\) 最小,所以 \(i\) 一定是最小环。

我们设最小环的长度为 \(cnt\),那么最后的答案就是 \(x-1+cnt-1=x+cnt-2\)。

这样我们就算出了总答案为 \((m-x)+(x+cnt-2)=m-cnt-2\)。


sub2

\(G\) 是一个大小为 \(n\),编号顺次为 \(1,2,3,\dots,n\)​ 的环。

2.1

此时 \(G'\) 是一棵树,我们令 \(G'\) 的根节点为 \(1\)。

我们只需要计算使 \(d(1,2)+d(2,3)+\cdots+d(n-1,n)+d(n,1)=2n-2\) 成立的 \(G'\) 的个数。

可以发现,\(d\) 的和实际上就是 \(1 \to 2 \to \dots \to n \to 1\) 的路径长,而 \(2n-2\) 代表每条边正好经过两次。如上图红色路径所示。

那么这样的路径实际上就是我们 dfs 的遍历过程,也就是说 \(1,2,\dots,n\) 是 \(G'\) 的欧拉序的子序列。

所以任意一个子树内所有节点的编号必定构成连续区间。下方称此结论为条件 \(1\)。


然后考虑如何计数。

我们设在 \(G'\) 中,\(1\) 的儿子中编号最大的是 \(y\),子树 \(y\) 中点的编号是 \([x,n]\)。

不难发现,除去子树 \(y\) 后的树编号是 \([1,x-1]\),也满足条件 \(1\),是一个子问题。

但因为 \(y\) 不是 \([x,n]\) 中编号最大的点,所以它不是子问题。但是如果我们将它拆分成 \([x,y]\) 和 \([y,n]\) 两个区间,我们发现,这两个区间都是满足条件 \(1\) 的,都是子问题。

那么我们就把答案拆分成了三个子问题:\([1,x-1],[x,y],[y,n]\)。

\([1,x-1]\) 而不是 \([1,x]\) 是因为 \(y\) 是 \(1\) 的儿子,\((1,y)\) 这条边一定存在。

发现区间的左右端点对答案没有影响,所以设 \(f_i\) 表示长度为 \(i\) 的连续区间的方案数。

那么答案 \(f_n=\sum_{i+j+k=n+1} f_i f_j f_k\)。用 \(h_n=\sum_{i+j=n} f_i f_j\) 辅助计算就可以达到 \(O(n^2)\)。


sub3

\(G\) 是仙人掌森林。

那么我们只需要找出最小环的个数 \(tot\),然后将最小环的答案乘上 \(tot\) 就好了。

注意不是乘方,时刻牢记我们只断一个环。


sub4

\(G\) 是杏仁。

题目中说,杏仁是恰好存在两个度数大于 \(2\) 的结点,其他结点度数都等于 \(2\),且所有环都经过两个度数大于 \(2\) 的结点的连通无向图。

我们翻译一下:\(G\) 中有两个点 \(S,T\),它们之间有 \(k\) 条不交路径,如下图。我们设这些路径长度从小到大依次为 \(L_1,L_2,\dots,L_k\)。

显然最小环的长度 \(cnt=L_1+L_2\),数量 \(tot\) 也好算,但是我们不能用 \(f_{cnt}\) 乘以数量来计算答案,因为会算重。

思考什么时候会算重。

3.1

如图,我们令绿色的环为 \(x\),红色的环为 \(y\),路径 \(S \to 3 \to T\) 为 \(L_1\),\(S \to 1 \to 2 \to T\) 为 \(L_2\),\(S \to 4 \to 5 \to T\) 为 \(L_3\)。

发现保留路径 \(L_2\),改变 \(L_1\) 与保留路径 \(L_3\),改变 \(L_1\) 的方案是完全重复的。

据此,我们定义 \(g_{a,b}\) 表示长度为 \(a\) 和 \(b\) 的路径构成的最小环中,保留路径 \(b\) 的方案数。那么对于上图情况,最后答案就是 \(2f_5-g_{2,3}\)。

拓展到整个图,令长为 \(L_1\) 的路径个数为 \(t_1\),长为 \(L_2\) 的路径个数为 \(t_2\):

  • 当 \(t_1 \neq 1\) 时,答案为 \(tot \times f_{cnt} - t_1 \times (t_1-1) \times g_{L_1,L_1}\)。
  • 当 \(t_1 = 1\) 时,答案为 \(tot \times f_{cnt} - t_2 \times (g_{L_1,L_2}+g_{L_2,L_1})\)。

现在只需要考虑怎么计算 \(g_{a,b}\) 了。

可以发现与条件 \(1\) 差别不大,可以推出 \(g_{a,b}=\sum_{i+j=a+1} f_i f_j\)。

发现其实与 \(b\) 无关,所以直接定义 \(g_i\) 为只更改最小环上长度为 \(i\) 的路径的方案数。


sub6

没有特殊限制。

我们类比 sub4 的解法,定义一个 \(G'\) 被图 \(G\) 中的环 \(C\) 影响,当且仅当所有不在 \(C\) 上的 \((u,v) \in G'\)。

如果 \(G'\) 被 \(C_1,C_2,\dots,C_t\) 影响,那么 \(G'\) 只能在 \(G\) 中 \(C_1,C_2,\dots,C_t\) 相交的路径 \(P\) 上作修改得到。

那么对于求解方案,我们可以找到 \(P\) 上的一段区间 \(P'\),长度为 \(P'_l\),然后只对 \(P'\) 进行改动。

发现这与我们 \(g\) 数组的定义很像。但是要注意的是,这里 \(P'\) 的端点所连的边也都会改动,所以我们要做一个容斥,答案是 \(g_{P'_l}+g_{P'_l-2}-2 \times g_{P'_l-1}\)。

但是其实可以发现,对于 \(G'\) 只被一个环 \(C\) 影响时,我们无法完全计算到它的贡献。因为多个环的相交部分一定不大于 \(\frac{cnt}{2}\)。

设 \(L\) 为组成最小环的路径,其中 \(L_1,L_2\) 与 \(L_1,L_3\) 均构成最小环。

如果相交部分 \(L_1 > \frac{cnt}{2}\),那么 \(L_1>\frac{L_1+L_2}{2}\),即 \(L_1>L_2\),同理 \(L_1>L_3\)。

此时发现 \(L_2+L_3<L_1+L_2\),即 \(L_2+L_3<cnt\),与 \(cnt\) 为最小环长的定义矛盾。

那么我们就需要统计 \(G'\) 只被一个环 \(C\) 影响的部分答案。

那么我们只需要进行一个容斥即可。


我们令在 \(G\) 中 \(dis(i,j)\) 表示 \(i\) 到 \(j\) 的最短路。

那么首先我们需要找出最小环长度 \(cnt\) 和数量 \(tot\),然后将 \(f\) 数组和 \(g\) 数组计算出来。

接下来我们枚举每个路径 \(P'\),即枚举路径的端点 \(s,t\),注意需要保证 \(dis(s,t) \le \frac{cnt}{2}\)。对答案的贡献为 \(g_{dis(s,t)}+g_{dis(s,t)-2}-2 \times g_{dis(s,t)-1}\)。

最后用容斥统计 \(G'\) 只被一个环 \(C\) 影响的部分答案。

然后将单个最小环的答案乘上 \(tot\)​,按 sub4 的方法去重就好了。


分析时间复杂度。

处理两点之间最短路、两点之间第一条路与最短路不同的最短路和最小环信息,用 bfs 可以做到 \(O(nm)\)。

\(f\) 数组与 \(g\) 数组。直接处理是 \(O(n^3)\),按 sub2 所述优化是 \(O(n^2)\)。

枚举路径计算答案是 \(O(n^2)\)。

总时间复杂度 \(O(nm+n^2)\)。

那么终于,这道题结束了。

代码实现

太难写了,先咕一会。


尾声

如果你发现了问题,你可以直接回复这篇题解

如果你有更好的想法,也可以直接回复!

标签:cnt,Transportaion,Wormhole,题解,路径,times,le,答案,我们
From: https://www.cnblogs.com/zsc985246/p/17407035.html

相关文章

  • P3919 【模板】可持久化线段树 1(可持久化数组) 题解
    一、题目描述:维护这样的一个长度为$n$的数组,支持以下两种操作$1$:在某个历史版本上修改某一个位置上的值$2$:访问某个历史版本上的某一位置的值每进行一次操作,就会生成一个新的版本(对于操作2,生成的就是一个完全一样的版本)。版本编号即为当前操作......
  • 题解:独占访问2 Exclusive Access 2
    题目链接怎么唯一一篇题解这么抽象,完全看不懂给定一张无向图,求给这张图定向成DAG之后的最长路最短是多少。转化一下变成对DAG进行分层,每一层之间的点没有连边,使得层数尽可能少,那么最后的层数就是答案。那么就求出若干个独立集,让独立集总数尽可能少。这是经典的色数问题,我们......
  • GYM102392 简要题解
    自己下午闲着没事单挑了一下,两小时左右一度rk1,但后继无力了。。。。A.MaxorMin肯定沿着出现过的数操作;然后发现如果a[i]=k,a[j]>k,a[k]<k就会增加一次操作所以维护一下差分序列即可。B.LevelUp两维DP,这个疑似edu出过。要注意的是:需要关于x排个序,不然会漏一些转移。D.......
  • AT_dp_s 题解
    题目传送门第一道数位\(\text{dp}\),检验一下自己懂没懂。特别感谢\(\text{yinhee}\)大佬,他的讲解令我受益匪浅。题目分析\(dp_{pos,res,lim}\)为当前枚举到从高位往低位数第\(pos\)位,数字和取模后的余数为\(res\)时的方案数,其中\(lim\)可以理解为一个布尔值,\(0\)表......
  • abc260_g Scalene Triangle Area 题解
    题目传送门题意给定一个大小为\(n\timesn\)的字符矩阵,每个字符为X或者O。对于一个位于\((x,y)\)的字符o和一个格子\((u,v)\),如果满足以下条件,那么\((u,v)\)就可以被\((x,y)\)控制。\(x\leqslantu\leqslantn\),\(y\leqslantv\leqslantn\)。\((u-x)+\fr......
  • 前端传递参数与后端接收的类属性不一致问题解决办法
    使用@JsonAlias作用是在反序列化的时候可以让Bean的属性接收多个json字段的名称。可以加在字段上或者getter和setter方法上。publicclassUser{ @JsonAlias({"name","user"}) privateStringusername; privateStringpassword; privateIntegerage;}这样子......
  • JOISC 2018 题解
    没做计算几何题和提交答案题。JOISC2018Day1ConstructionofHighway道路建设注意到题目中的操作相当于就是到根的路径染色,我们离线下来进行树剖,每条重链维护连续段,然后显然均摊会修改\(O(n\logn)\)段。我们每次修改时可以取出所有连续段,然后题目问逆序对数,我们对这些连续......
  • ORA-02049:超时:分布式事务处理等待锁 问题解决
    数据库添加DBLink后,很容易出现一个问题:ORA-02049:超时:分布式事务处理等待锁ORA-02063:紧接着line(起自ODS_LINK) 问题原因分析:第一次执行操作后出错,数据库没有提交或回退,未关闭原有数据库窗口,重新打开新窗口执行数据插入操作,报ORA-02049错误。解决办法:数据库登陆管理员账号查看1、......
  • 跨域问题解决记录Access-Control-Allow-Origin方法
      more_set_headers 'Access-Control-Allow-Origin: http://devops.opsenv.com';    more_set_headers 'Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS';    more_set_headers 'Access-Control-Allow-Headers: Authorization,DNT,......
  • el-popover无法弹出的问题解决
    1、不能再el-popover上⾯使⽤v-if进⾏显⽰隐藏,应该⽤v-show2、在每⼀个el-popover上都增加⼀个ref确定每个el-popover都是唯⼀的,:ref="`node-popover-${scope.row.id}`"3、需要使⽤slot="reference"定义由哪个元素触发事件。除此之外,还有一种特殊情况就是在table使用el-popover也......