\(\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. 下载并搭建maven环境

    1.下载maven 1.在官网下载maven  http://maven.apache.org/download.cgi 2.将下载maven解压.复制路径. 2.搭建maven环境 1.新建M2_H ...

  2. BeanUtils.copyProperties 选择性赋值字段

    BeanUtils.copyProperties 在字段赋值上有强大的功能,如果有两个的类,如果需要将相同的字段赋值,就可以直接赋制.而不需要每个字段都需要一个一个赋制. BeanUtils.copy ...

  3. 常用Cron表达式范例

    描述 表达式 每隔5秒执行一次 */5 * * * * ? 每隔1分钟执行一次 0 */1 * * * ? 每天23点执行一次 0 0 23 * * ? 每天凌晨1点执行一次 0 0 1 * * ? ...

  4. (转)Make 命令

    Make 命令 代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的安排),叫做构建(build). Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目 ...

  5. 《剑指offer》面试题17. 打印从1到最大的n位数

    问题描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5 ...

  6. WPF使用MVVM(二)-命令绑定

    WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...

  7. rocketmq实现延迟队列精确到秒级实现方案2-时间轮和delay-file实现

    上图是通过RocketMQ源码分析一个实现原理方案示意图. 分为两个部分: 消息的写入消息的Schedule 在写入CommitLog之前,如果是延迟消息,按照每10分钟写入delayfile文件,对 ...

  8. Windows和Linux关闭占用端口

    关闭端口的方式有很多种,但是常用的就是这种比较来的快一点 如果通过以下方式解决不了,可以通过关闭服务来解决 Windows 1.查看端口占用的进程 netstat -ano | findstr 800 ...

  9. 学习AJAX必知必会(4)~同源策略、解决跨域问题(JSONP、CORS)

    一.同源策略(Same-Origin Policy),是浏览器的一种安全策略. 1.同源(即url相同):协议.域名.端口号 必须完全相同.(请求是来自同一个服务) 2.跨域:违背了同源策略,即跨域. ...

  10. phpstudy后门POC分析和EXP开发

    POC 2019年9月20日,网上传出 phpStudy 软件存在后门,随后作者立即发布声明进行澄清,其真实情况是该软件官网于2016年被非法入侵,程序包自带PHP的php_xmlrpc.dll模块被 ...