Mole and Abandoned Mine
Mole and Abandoned Mine
n点m条边的无向图,删除第i条边花费c[i],问1到n只有一条路径时所需要的最小花费? \(2\le n\le 15\) 。
我又A掉了一道zzs的题啦!
首先,我们观察1到n只有一条路径时,图是怎么样的。显然是一条1到n的链,链上的每个点都挂了很多子联通块,但这些子连通块互不连通。(exp:对于某些图论题,观察要求的东西,看看能否把它的性质描述出来。放到这道题里就是这条路径的性质。)
然后,用\(f[S][x]\)表示现在选入的点集是S,链的最后一个点是x。那么\(f[S][x]+c[x][u]\rightarrow f[S+\{u\}][u]\)(对应延伸链的长度),\(f[S][x]+p[Y]\rightarrow f[S|Y][x]\)(对应在x的集合中多加一个连通块)。
路人甲(我):哎哎哎这个dp不是把x的所有连通块排列都统计进去了吗,会错的啊!
大佬:你个sb,这道题又不是计数题。
exp*2:只有计数题才要求转移时每种方案统计一次。这种最优值题,方案被多统计并没有关系,反正是取个max。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=17, maxst=(1<<17)-1;
int n, m, sum, e[maxn][maxn], p[maxst], f[maxst][maxn];
inline int max(int x, int y){ return x<y?y:x; }
inline void up(int &x, int y){ x=max(x, y); }
int main(){
scanf("%d%d", &n, &m); int a, b, c, ans=0;
memset(f, -1, sizeof(f)); //还是那个,不能让不合法状态成功转移
for (int i=0; i<m; ++i){
scanf("%d%d%d", &a, &b, &c); --a; --b;
e[a][b]=e[b][a]=c; sum+=c; }
for (int i=0; i<1<<n; ++i){
for (int j=0; j<n; ++j) if (i&(1<<j))
for (int k=0; k<n; ++k) if (i&(1<<k))
p[i]+=e[j][k];
p[i]>>=1; }
f[1][0]=0;
for (int i=1; i<(1<<n); ++i){ //当前集合
for (int j=0; j<n; ++j){ //当前挂的点
if (f[i][j]==-1) continue;
for (int k=0; k<n; ++k){ //枚举新在j后加的点
if (i&(1<<k)) continue;
if (e[j][k]==0) continue; //绝壁想不到的东西!果然转移要想清楚,限制一定要先治好,不能让不合法状态成功转移
up(f[i|(1<<k)][k], f[i][j]+e[j][k]);
}
int revi=(((1<<n)-1)^i)|(1<<j); //枚举新挂在j上的集合(要加上j以统计连j的边)
for (int k=revi; k; k=(k-1)&revi)
up(f[i|k][j], f[i][j]+p[k]);
}
}
for (int i=0; i<(1<<n); ++i)
up(ans, f[i][n-1]);
printf("%d\n", sum-ans);
return 0;
}
Mole and Abandoned Mine的更多相关文章
- AT2657 Mole and Abandoned Mine
传送门 好神的状压dp啊 首先考虑一个性质,删掉之后的图一定是个联通图 并且每个点最多只与保留下来的那条路径上的一个点有边相连 然后设状态:\(f[s][t]\)代表当前联通块的点的状态为\(s\)和 ...
- 题解-AtCoder ARC-078F Mole and Abandoned Mine
problem ATC-arc078F 题意概要:给定一个 \(n\) 点 \(m\) 边简单无向图(无自环无重边),边有费用,现切去若干条边,使得从 \(1\) 到 \(n\) 有且仅有一条简单路径 ...
- AtCoder arc078_d Mole and Abandoned Mine
洛谷题目页面传送门 & AtCoder题目页面传送门 给定一个无向连通带权图\(G=(V,E),|V|=n,|E|=m\)(节点从\(0\)开始编号),要删掉一些边使得节点\(0\)到\(n- ...
- [atARC078F]Mole and Abandoned Mine
注意到最终图的样子可以看作一条从1到$n$的路径,以及删去这条路径上的边后,路径上的每一个点所对应的一个连通块 考虑dp,令$f_{S,i}$表示当前1到$n$路径上的最后一个点以及之前点(包括$i$ ...
- AT2657 [ARC078D] Mole and Abandoned Mine
简要题解如下: 记 \(1\) 到 \(n\) 的路径为关键路径. 注意到关键路径只有一条是解题的关键,可以思考这张图长什么样子. 不难发现关键路径上所有边均为桥,因此大致上是关键路径上每个点下面挂了 ...
- 【做题】arc078_f-Mole and Abandoned Mine——状压dp
题意:给出一个\(n\)个结点的联通无向图,每条边都有边权.令删去一条边的费用为这条边的边权.求最小的费用以删去某些边使得结点\(1\)至结点\(n\)有且只有一条路径. \(n \leq 15\) ...
- AtCoder Regular Contest 078
我好菜啊,ARC注定出不了F系列.要是出了说不定就橙了. C - Splitting Pile 题意:把序列分成左右两部分,使得两边和之差最小. #include<cstdio> #inc ...
- 【AtCoder】ARC078
C - Splitting Pile 枚举从哪里开始分的即可 #include <bits/stdc++.h> #define fi first #define se second #de ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
随机推荐
- java代码split分割数字类
总结:正则表达式-- package com.c2; //写一个spli的用法,数字类 ===分割字符串 public class yqw { public static void main(Stri ...
- 侯捷STL学习(七)--深度探索vector&&array
layout: post title: 侯捷STL学习(七) date: 2017-06-13 tag: 侯捷STL --- 第十六节 深度探索vector vector源码剖析 vector内存2倍 ...
- delphi 10.2.2.2004 Tokyo 安装步骤
delphi 各版本的安装,其XX工具都附有详细说明.遵守其安装步骤,很容易成功. 本教就以 delphi 10.2.2.2004 为例,演示一下整个安装过程.其它各版本就自行尝试. 附: delph ...
- python 2.7.5升级到3.4.x
wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz .tgz cd Python-/ Python ./configure ma ...
- AndroidStudio 中使用FFMPEG
1.下载 FFmpeg 源码 git clone https://git.ffmpeg.org/ffmpeg.git 这一步可能会花比较长的时间 2.编译 FFmpeg for Android 2.1 ...
- LINUX 使用DBCA创建ORACLE数据库
- [codeforces126B]Password
解题关键:KMP算法中NEXT数组的理解. #include<bits/stdc++.h> #define maxn 1000006 using namespace std; typede ...
- ROS探索总结(二)——ROS总体框架
个人分类: ROS 所属专栏: ROS探索总结 一. 总体结构 根据ROS系统代码的维护者和分布来标示,主要有两大部分: (1)main:核心部分,主要由Willow G ...
- javascript 函数,事件
1.函数字符串函数 var s=new string(); var ss="hello world"; var sss=""HELLO, WORLD" ...
- R: 正则表达式
正则表达式: 例:sub("a","",c("abcd","dcba")): [1] "bcd" ...