\(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. awk1

    awk [选项参数] 'script' var=value file(s)或aawk [选项参数] -f scriptfile var=value file(s)项参数说明:-F fs or --fi ...

  2. 位图bitmap应用

    所有比特的编号方法是,从低字节的低位比特位开始,第一个bit为0,最后一个bit为 n-1. 比如说,现在有个数组是这样子的,int a[4],那么a[0]的比特位为0--31a[1]的比特位为32- ...

  3. Mysql_笔记2018.1.28

    1.Mysql代码规范 1.关键字.函数名称大写 2.数据库名称.表名称.字段名称等全部小写 3.必须以分号;结尾 (或 \g) 2.记录mysql日志 开始记录 mysql> \T 日志地址 ...

  4. kali 系列学习12-使用Wifite破解无线网络

    一些破解无线网络程序是使用Aircrack-ng工具集,并添加了一个图形界面或使用文本菜单的形式来破解无线网络.这使得用户使用它们更容易,而且不需要记住任何命令.本节将介绍使用命令行工具Wifite, ...

  5. MindManager使用教程:如何导出HTML5交互式导图

    Mindmanager思维导图软件有着友好的用户界面以及丰富的思维导图制作功能.再搭配与Microsoft 软件的无缝集成功能,使得这款思维导图软件越来越受到职场人士的喜爱. 不仅是作为制作思维导图的 ...

  6. 在线思维导图Ayoa可以用来梳理双十一优惠规则哦

    一年一度的双十一又要来了,小伙伴们是否准备好开始买买买了呢?今年双十一,遇上英雄联盟S10总决赛,1/4决赛苏宁对上京东也让这个"电商大战"产生了很多有趣的梗.当然在玩梗的同时,广 ...

  7. 如何灵活运用ABBYY FineReader的识别功能

    由于工作的原因,经常会使用到文字识别工具,说真的,一款好用的文字识别工具能省不少事,前不久碰到一位职场新人,他的工作内容也离不开文字识别工具,他还问我有什么好用的软件推荐,说到好用,还是ABBYY F ...

  8. Codeforces Round #672 (Div. 2) B. Rock and Lever题解(思维+位运算)

    题目链接 题目大意 给你一个长为n(n<=1e5)的数组,让你求有多少对a[i]和a[j] (i!=j)满足a[i]&a[j]>a[i]^a[j] 题目思路 这些有关位运算的题目肯 ...

  9. .NET使用AutoResetEvent实现多线程打印奇偶数

    AutoResetEvent 类 (System.Threading) | Microsoft Docs 定义 命名空间: System.Threading 程序集: mscorlib.dll, Sy ...

  10. mfc 笔记

    在类成员初始化时,使用另一个成员变量,必须满足,在.h声明时在另一个变量之后,初始 .hprivate: //K线图位置 CPoint m_KPoint; //十字光标位置 CPoint m_trac ...