\(f[s][i][j]\) 表示一条有向路径(不经过重复点),当前路径点集合为 \(s\),最后两个点是 \(j\) → \(i\) 的最大价值

\(g[s][i][j]\) 类似,不过是方案数。

较为显然的转移,枚举 \(s\) 中的点 \(k (i \not= j \not = k)\):

\(f[s][i][j] = \max(f[s\ \text{xor}\ 2^k][j][k] + a[i] \times a[j] + \text{w}(i,j,k))\)

\(\text{w}(i, j, k)\) 表示 \(i, j, k\) 如果构成一个环的权值,否则为 \(0\)。

方案数也是类似的。

初始化两点路径,即 \(f[2^i\ \text{or}\ 2^j][i][j] = a[i] \times a[j]\)

注意方案数最后要 \(/2\),因为会统计两次(我们规定的是有向)

复杂度

\(O(2^n\times n^3)\) 用 \(\text{lowbit}\) 应该还能省复杂度,但是我不会算

注意特判一个节点的时候

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std; typedef long long LL; const int N = 13; int n, m, a[N], Log[1 << N], sum; bool w[N][N]; LL f[1 << N][N][N], g[1 << N][N][N]; void out(int x) {
for (int i = 0; i < n; i++)
printf("%d", x >> i & 1);
} void inline clear() {
memset(w, false, sizeof w);
memset(g, 0, sizeof g);
memset(f, 0, sizeof f);
sum = 0;
} int main() {
int T; scanf("%d", &T);
while (T--) {
clear();
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", a + i), Log[1 << i] = i, sum += a[i];
for (int i = 1; i <= m; i++) {
int a, b; scanf("%d%d", &a, &b);
--a, --b;
w[a][b] = w[b][a] = true;
}
if (n == 1) { printf("%d %d\n", a[0], 1); continue; }
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j && w[i][j]) {
f[(1 << i) | (1 << j)][i][j] = a[i] * a[j];
g[(1 << i) | (1 << j)][i][j] = 1;
}
}
}
for (int s = 1; s < (1 << n); s++) {
for (int A = s, i = Log[s & -s]; A ; A -= 1 << i, i = Log[A & -A]) {
for (int B = s ^ (1 << i), j = Log[B & -B]; B; B -= 1 << j, j = Log[B & -B]) {
if (!w[i][j]) continue;
for (int C = s ^ (1 << i) ^ (1 << j), k = Log[C & -C]; C; C -= 1 << k, k = Log[C & -C]) {
if (!w[j][k] || !f[s ^ (1 << i)][j][k]) continue;
LL val = f[s ^ (1 << i)][j][k] + a[i] * a[j] + (w[i][k] ? a[i] * a[j] * a[k] : 0);
if (val > f[s][i][j]) f[s][i][j] = val, g[s][i][j] = g[s ^ (1 << i)][j][k];
else if (val == f[s][i][j]) g[s][i][j] += g[s ^ (1 << i)][j][k];
}
}
}
}
LL res = 0, cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!g[i][j]) continue;
if (f[(1 << n) - 1][i][j] > res) res = f[(1 << n) - 1][i][j], cnt = g[(1 << n) - 1][i][j];
else if (f[(1 << n) - 1][i][j] == res) cnt += g[(1 << n) - 1][i][j];
}
}
if (!res) puts("0 0");
else printf("%lld %lld\n", res + sum, cnt / 2);
}
return 0;
}

AcWing 1194. 岛和桥的更多相关文章

  1. ACM-世界岛旅行

    [问题描述] 某旅游公司组团去迪拜世界岛旅游.世界岛由n个岛屿组成,岛屿序号为1-n,这些岛屿都直接或间接相连.岛屿之间用桥梁连接.现从1号岛屿开始游览,并约定按如下方式游览: 1) 每游览完一个岛屿 ...

  2. sjtu1313 太湖旅行

    Description 西山风景区是苏州著名的国家级风景区,一到暑假,游客们都蜂拥而至.作为太湖风景区的精华,西山景区吸引人的地方主要在它的群岛风光.花果丛林和名胜古迹. ginrat对这个地方向往已 ...

  3. ACM学习之路___HDU 5723(kruskal + dfs)

    Abandoned country Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s) ...

  4. codeforces 869C The Intriguing Obsession【组合数学+dp+第二类斯特林公式】

    C. The Intriguing Obsession time limit per test 1 second memory limit per test 256 megabytes input s ...

  5. Codeforces Round #310 (Div. 2)简洁题解

    A:原来是大水题,我还想去优化.. 结果是abs(num('0')-num('1')); num表示一个符号的个数; B:暴力模拟即可,每次判断是否能构造出答案. C:俄罗斯套娃,套套套,捉鸡的E文. ...

  6. 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]

    [题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...

  7. PKU 2288 Islands and Bridges 状态dp

    题意: 给你一张地图,上面有一些岛和桥.你要求出最大的三角哈密顿路径,以及他们的数量. 哈密顿路:一条经过所有岛的路径,每个岛只经过一次. 最大三角哈密顿路:满足价值最大的哈密顿路. 价值计算分为以下 ...

  8. 【日语】日语单词N3_N4_N5

    日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...

  9. 日语单词N3_N4_N5

    单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. 挨拶(あいさつ):① 寒暄 ...

随机推荐

  1. P类问题、NP类问题与NPC类问题

    (转载自作者 "Matrix67原创" 的文章,链接为:http://www.matrix67.com/blog/archives/105) 你会经常看到网上出现"这怎么 ...

  2. MySQL时间类型datetime、bigint及timestamp的查询效率

    前期数据准备 通过程序往数据库插入 50w 数据 数据表: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time_dat ...

  3. PHP代码审计入门(SQL注入漏洞挖掘基础)

    SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ...

  4. Java 枚举 enum 详解

    本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...

  5. 如何用FL Studio做电音

    电音制作,自然少不了适合做电音的软件,市面上可以进行电音制作的软件不少,可是如果在这些软件中只能选择一款的话,想必多数人会把票投给FL Studio,毕竟高效率是永远不变的真理,今天就让我们来看看如何 ...

  6. FL Studio中如何使用插件混杂功能中的琶音器

    琶音指一串和弦音从低到高或从高到低依次连续奏出,可视为分解和弦的一种.通常作为一种专门的技巧训练用于练习曲中,有时作为短小的连接句或经过句出现在乐曲旋律声部中.在Trance类型电子音乐中,琶音的运用 ...

  7. guitar pro系列教程(二十五):Guitar Pro教程之组织小节

    上一章节我们讲述了关于Guitar Pro 7的主界面的相关功能的介绍,对于初学作曲,又是吉他的初学者,刚刚接触Guitar Pro时,很多的功能,符号,工具都市不熟悉的,这样在创作,使用的过程中就会 ...

  8. 能否安装 CrossOver 上没有的软件

    系统兼容软件CrossOver可以像虚拟机一下帮助我们在Mac或者Linux上运行Windows应用程序,快速实现跨平台文件互通,所以我们也称它为类虚拟机. 不需要安装Windows操作系统的Cros ...

  9. jQuery 根据value设置radio默认选中

    jQuery 根据value设置radio默认选中:HTML: <input type="radio" name="type" value="1 ...

  10. yii的pathinfo方式实现

    yii2.0在浏览器中默认查看控制器下的方法是  http://ltbk.cn/index.php?r=login/login 要是在浏览器上输出 http://ltbk.cn/index.php/l ...