简要题解如下:

记 \(1\) 到 \(n\) 的路径为关键路径。

  1. 注意到关键路径只有一条是解题的关键,可以思考这张图长什么样子。

  2. 不难发现关键路径上所有边均为桥,因此大致上是关键路径上每个点下面挂了很多个连通块。

  3. 基于这张图的形态涉及一个 \(dp\),令 \(f_{i, S}\) 表示当前只考虑 \(S\) 这个集合,当前在关键路径上走到的点为 \(i\) 留下的最大边权。

  4. 转移有两种,一种是直接考虑在关键路径上往后扩展一个点 \(j\),令一种方式是考虑在 \(i\) 下面挂上一个连通块 \(T\) 此处可以枚举子集。通过预处理等技巧可以做到 \(\mathcal{O(n ^ 2 2 ^ n + n 3 ^ n)}\)

#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 20;
const int M = (1 << 15) + 5;
int n, m, u, v, c, L, all, g[M], w[N][N], f[N][M], dp[N][M];
int main () {
cin >> n >> m, L = (1 << n) - 1;
memset(w, 128, sizeof(w)), memset(dp, 128, sizeof(dp));
rep(i, 1, m) cin >> u >> v >> c, w[u][v] = w[v][u] = c, all += c;
rep(S, 0, L) rep(i, 1, n) rep(j, 1, n) if((1 << (j - 1)) & S) f[i][S] += max(0, w[i][j]);
rep(S, 0, L) {
rep(i, 1, n) rep(j, 1, n) if(((1 << (i - 1)) & S) && ((1 << (j - 1)) & S)) g[S] += max(0, w[i][j]);
g[S] /= 2;
}
dp[1][1] = 0;
rep(S, 0, L) rep(i, 1, n) if(dp[i][S] >= 0) {
rep(j, 1, n)
if(!((1 << (j - 1)) & S) && w[i][j] > 0)
dp[j][S | (1 << (j - 1))] = max(dp[j][S | (1 << (j - 1))], dp[i][S] + w[i][j]);
for (int T = (L ^ S); T; T = ((T - 1) & (L ^ S)))
dp[i][S | T] = max(dp[i][S | T], dp[i][S] + f[i][T] + g[T]);
}
printf("%d", all - dp[n][L]);
return 0;
}

一定要将思路理清,考虑最终状态的时候一定要完全准确,否则可能会出现某些性质没有发现的情况。

AT2657 [ARC078D] Mole and Abandoned Mine的更多相关文章

  1. Mole and Abandoned Mine

    Mole and Abandoned Mine n点m条边的无向图,删除第i条边花费c[i],问1到n只有一条路径时所需要的最小花费? \(2\le n\le 15\) . 我又A掉了一道zzs的题啦 ...

  2. AT2657 Mole and Abandoned Mine

    传送门 好神的状压dp啊 首先考虑一个性质,删掉之后的图一定是个联通图 并且每个点最多只与保留下来的那条路径上的一个点有边相连 然后设状态:\(f[s][t]\)代表当前联通块的点的状态为\(s\)和 ...

  3. 题解-AtCoder ARC-078F Mole and Abandoned Mine

    problem ATC-arc078F 题意概要:给定一个 \(n\) 点 \(m\) 边简单无向图(无自环无重边),边有费用,现切去若干条边,使得从 \(1\) 到 \(n\) 有且仅有一条简单路径 ...

  4. AtCoder arc078_d Mole and Abandoned Mine

    洛谷题目页面传送门 & AtCoder题目页面传送门 给定一个无向连通带权图\(G=(V,E),|V|=n,|E|=m\)(节点从\(0\)开始编号),要删掉一些边使得节点\(0\)到\(n- ...

  5. [atARC078F]Mole and Abandoned Mine

    注意到最终图的样子可以看作一条从1到$n$的路径,以及删去这条路径上的边后,路径上的每一个点所对应的一个连通块 考虑dp,令$f_{S,i}$表示当前1到$n$路径上的最后一个点以及之前点(包括$i$ ...

  6. 【做题】arc078_f-Mole and Abandoned Mine——状压dp

    题意:给出一个\(n\)个结点的联通无向图,每条边都有边权.令删去一条边的费用为这条边的边权.求最小的费用以删去某些边使得结点\(1\)至结点\(n\)有且只有一条路径. \(n \leq 15\) ...

  7. AtCoder Regular Contest 078

    我好菜啊,ARC注定出不了F系列.要是出了说不定就橙了. C - Splitting Pile 题意:把序列分成左右两部分,使得两边和之差最小. #include<cstdio> #inc ...

  8. 【AtCoder】ARC078

    C - Splitting Pile 枚举从哪里开始分的即可 #include <bits/stdc++.h> #define fi first #define se second #de ...

  9. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

随机推荐

  1. Django项目部署到Apache服务器上

    之前写了把Django部署到XAMPP上,但是有bug,翻apache日志的时候发现会无法import _ssl,然后我就怒而直接装apache2了 配置方法大约和这篇文章差不多 安装必要的包 sud ...

  2. Vue.js高效前端开发 • 【初识Vue.js】

    全部章节 >>>> 文章目录 一.Vue概述 1.Web前端框架介绍 2.MVC和MVVM 3.Vue介绍 4.安装Vue 二.Vue使用 1.第一个Vue应用 2.Vue的双 ...

  3. html基础 有语义的布局标签

  4. 初识python: while循环 猜年龄小游戏

    知识点: 1.python注释方法: 单行注释: # 多行注释: '''注释内容 '''  (单引号或双引号都可以),亦可打印多行 例: #此处是单行注释信息 print('这里是打印内容') #这里 ...

  5. 【IntelliJ IDEA】代码模板

    psvm:main方法 sout:console输出 iter:foreach遍历 fori:for索引遍历

  6. GoWeb之gin框架

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 一.快速上手 安装 go mod init go get -u ...

  7. 详解Scrapy的命令行工具

    接触过Scrapy的人都知道,我们很多操作是需要借助命令行来执行的,比如创建项目,运行爬虫等.所以了解和掌握这些命令对于scrapy的学习是很有帮助的! Scrapy 命令 首先,在scrapy命令中 ...

  8. “老”的Flexbox和“新”的Flexbox

    本文由大漠根据Chris Coyier的<"Old" Flexbox and "New" Flexbox>所译,整个译文带有我们自己的理解与思想,如 ...

  9. MongoDB之几种情况下的索引选择策略

    一.MongoDB如何选择索引 如果我们在Collection建了5个index,那么当我们查询的时候,MongoDB会根据查询语句的筛选条件.sort排序等来定位可以使用的index作为候选索引:然 ...

  10. Redis 事务支持 ACID 么?

    腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通.」 ...