\(\mathcal{Description}\)

  Link.

  给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,每条边的两种定向方法各有权值,求使得图强连通且定向权值和最小的方法。

  \(n\le 18\)。

\(\mathcal{Solution}\)

  涉及到叫做“耳分解”的知识点。

有向图 \(G=(V,E)\) 是否强连通有以下判别方法:

  • 取任意 \(u\in V\),令点集 \(S=\{u\}\);
  • 反复取 \(x,y\in S\),以及连接 \(x,y\) 的一条有向路径 \(P=\lang x,u_1,\cdots,u_k,y\rang\),满足 \(u_i\not\in S,~i\in[1,k]\),并令 \(S\leftarrow S\cup\{u_1,\cdots,u_k\}\)。
  • 若 \(S=V\),则 \(G\) 强连通;否则即找不到增广路 \(P\),\(G\) 非强连通。

其中 \(P\) 就是一个“耳”,这就是“耳分解”。

——当然“耳”貌似最初定义于无向图。

  知道了这个构造强连通图的 trick 就极简了,首先在双向边权中随便选一个预支付代价,并令 \(f(S)\) 表示在 \(S\) 的导出子图内使 \(S\) 强连通的最小代价,\(g(S,x,y,0/1)\) 表示点集 \(S\) 中,当前正在构造的“耳”从 \(x\) 出发,希望回到 \(y\),不能/能 直接走 \(\lang x,y\rang\) 这条边。随便转移即可。复杂度上限是 \(\mathcal O(2^nn^3)\),但算法本身和状态合法性带来了小常数√

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cstdio>
#include <cstring> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 18, IINF = 0x3f3f3f3f;
int n, adj[MAXN + 5][MAXN + 5], f[1 << MAXN], g[1 << MAXN][MAXN][MAXN][2]; inline void chkmin( int& a, const int b ) { b < a && ( a = b ); }
inline int imin( const int a, const int b ) { return a < b ? a : b; } int main() {
// freopen( "data.in", "r", stdin ); scanf( "%d", &n );
rep ( i, 0, n - 1 ) rep ( j, 0, n - 1 ) scanf( "%d", &adj[i][j] ); int ans = 0;
rep ( i, 0, n - 1 ) rep ( j, i + 1, n - 1 ) {
if ( ~adj[i][j] ) {
int t = imin( adj[i][j], adj[j][i] );
ans += t, adj[i][j] -= t, adj[j][i] -= t;
}
} memset( f, 0x3f, sizeof f ), memset( g, 0x3f, sizeof g ), f[1] = 0;
rep ( S, 1, ( 1 << n ) - 1 ) if ( S & 1 ) {
rep ( u, 0, n - 1 ) if ( S >> u & 1 ) {
rep ( v, 0, n - 1 ) if ( S >> v & 1 && ~adj[u][v] ) {
chkmin( f[S], g[S][u][v][1] + adj[u][v] );
}
} rep ( u, 0, n - 1 ) if ( S >> u & 1 ) {
rep ( v, 0, n - 1 ) if ( S >> v & 1 ) {
chkmin( g[S][u][v][0], f[S] );
}
} rep ( u, 0, n - 1 ) if ( S >> u & 1 ) {
rep ( v, 0, n - 1 ) if ( S >> v & 1 ) {
int* cur = g[S][u][v];
if ( cur[0] != IINF ) {
rep ( w, 0, n - 1 ) if ( ~adj[u][w] && !( S >> w & 1 ) ) {
chkmin( g[S | 1 << w][w][v][u != v],
cur[0] + adj[u][w] );
}
}
if ( cur[1] != IINF ) {
rep ( w, 0, n - 1 ) if ( ~adj[u][w] && !( S >> w & 1 ) ) {
chkmin( g[S | 1 << w][w][v][1], cur[1] + adj[u][w] );
}
}
}
}
} printf( "%d\n", f[( 1 << n ) - 1] == IINF ? -1 : ans + f[( 1 << n ) - 1] );
return 0;
}

Solution -「Gym 102759C」Economic One-way Roads的更多相关文章

  1. Solution -「Gym 102979E」Expected Distance

    \(\mathcal{Description}\)   Link.   用给定的 \(\{a_{n-1}\},\{c_n\}\) 生成一棵含有 \(n\) 个点的树,其中 \(u\) 连向 \([1, ...

  2. Solution -「Gym 102979L」 Lights On The Road

    \(\mathcal{Description}\)   Link.   给定序列 \(\{w_n\}\),选择 \(i\) 位置的代价为 \(w_i\),要求每个位置要不被选择,要不左右两个位置至少被 ...

  3. Solution -「Gym 102956F」Find the XOR

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \(m\) 条边的连通无向图 \(G\),边有边权.其中 \(u,v\) 的距离 \(d(u,v)\) ...

  4. Solution -「Gym 102956B」Beautiful Sequence Unraveling

    \(\mathcal{Description}\)   Link.   求长度为 \(n\),值域为 \([1,m]\) 的整数序列 \(\lang a_n\rang\) 的个数,满足 \(\not\ ...

  5. Solution -「Gym 102956F」Border Similarity Undertaking

    \(\mathcal{Description}\)   Link.   给定一张 \(n\times m\) 的表格,每个格子上写有一个小写字母.求其中长宽至少为 \(2\),且边界格子上字母相同的矩 ...

  6. Solution -「Gym 102956A」Belarusian State University

    \(\mathcal{Description}\)   Link.   给定两个不超过 \(2^n-1\) 次的多项式 \(A,B\),对于第 \(i\in[0,n)\) 个二进制位,定义任意一个二元 ...

  7. Solution -「Gym 102798I」Sean the Cuber

    \(\mathcal{Description}\)   Link.   给定两个可还原的二阶魔方,求从其中一个状态拧到另一个状态的最小步数.   数据组数 \(T\le2.5\times10^5\). ...

  8. Solution -「Gym 102798K」Tree Tweaking

    \(\mathcal{Description}\)   Link.   给定排列 \(\{p_n\}\),求任意重排 \(p_{l..r}\) 的元素后,将 \(\{p_n\}\) 依次插入二叉搜索树 ...

  9. Solution -「Gym 102798E」So Many Possibilities...

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\) 和 \(m\),每次随机在 \(\{a\}\) 中取一个非零的 \(a_i\)(保证存 ...

随机推荐

  1. SpringMVC拦截器的应用

    一.作用 好文章参考:https://www.cnblogs.com/panxuejun/p/7715917.html 对请求进行预处理和后处理: 使用场景: 登录验证,判断用户是否登录 权限验证,判 ...

  2. SYCOJ246螺旋矩阵

    题目-螺旋矩阵 (shiyancang.cn) noip201403螺旋矩阵[普及组]数学算法 - 大本营 - 博客园 (cnblogs.com) 以下为搬运代码.一个为算圈数,另外一个是数学方法 思 ...

  3. 软件开发架构与网络之OSI七层协议(五层)

    本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...

  4. redis的bind误区

    对于Redis中bind的正确的理解是:bind:是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址.如果指定了bi ...

  5. elasticsearch之拼音搜索

    拼音搜索在中文搜索环境中是经常使用的一种功能,用户只需要输入关键词的拼音全拼或者拼音首字母,搜索引擎就可以搜索出相关结果.在国内,中文输入法基本上都是基于汉语拼音的,这种在符合用户输入习惯的条件下缩短 ...

  6. 《剑指offer》面试题22. 链表中倒数第k个节点

    问题描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  7. 《剑指offer》面试题45. 把数组排成最小的数

    问题描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.   示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: ...

  8. 将Cesium ion上的3D Tiles和Bing imagery应用到osgEarth

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Pelican Mapping 激动的宣布支持加载Cesium ...

  9. 花了半年时间,我把Pink老师的HTMLCSS视频课程,整理成了10万字的Markdown笔记!

    说明:本文内容真实!!!不是推广!!! 学习前端的同学应该都或多或少听说过 Pink 老师,我个人觉得 Pink 老师的前端视频教程应该说是目前B站上最好的了,没有之一! Pink老师 HTML CS ...

  10. 一:linux安装nginx

    目录 1.yun安装 2.二进制安装 3.编译安装 1.yun安装 nginx官网:https://nginx.org/ [root@web01 ~]# vim /etc/yum.repos.d/ng ...