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

problem

ATC-arc078F

题意概要:给定一个 \(n\) 点 \(m\) 边简单无向图(无自环无重边),边有费用,现切去若干条边,使得从 \(1\) 到 \(n\) 有且仅有一条简单路径,求最小化花费。

\(n\le 15, n-1\le m\le \binom n2\)

Solution

看到 \(n\leq 15\) 大概就能猜到复杂度是 \(O(3^n)\) 左右的,然后直接思考用斯坦纳树咋解,无果。

开始思考最终局面的情况,一定是有一条 \(1\) 到 \(n\) 的路径,且不能存在其他路径连接这条路径上的两个点。换句话说,就是从每个点出发且只走非路径边的话只能到达一个路径上的点。

考虑原问题要求最小化删边费用,对应上面的做法容易想到要转换为最大化留下来的边权和

把图画出来,大概是说路径上每个点下头都挂上了若干个集合,而由于要最大化比边权和,所以每个集合内部的所有边均予以保留。

那么就很容易得到一个dp:设 \(f[i][S]\) 表示在路径(最终连接 \(1\) 和 \(n\) 的路径)上走到了 \(i\),并且集合 \(S\) 内的点已经挂在了前头,那么有两种转移:

  • 在路径上更进一步:\(f[i][S] \rightarrow f[j][S\cup \{j\}]\),增加权值为连接 \(i,j\) 的边权
  • 在当前点挂一个集合:\(f[i][S]\rightarrow f[i][S\cup T]\),增加权值为集合 \(T\) 内所有边的边权和

那么只要预处理一个 \(g[S]\) 表示集合 \(S\) 内的边权和,这一步可以暴力求,复杂度 \(O(2^nn^2)\)

再进行转移,转移时需要枚举子集(对于全局而言,枚举补集的子集和枚举子集复杂度相当),复杂度 \(O(n3^n)\)

总复杂度 \(O(2^nn^2+n3^n)\)

Code

#include <cstdio>

#define bin(x) (1<<(x))
#define b(x) (1<<(x)>>1)

inline void cmax(int&x, const int y) {x < y && (x = y);}

const int N = 17, M = 40100;
int f[N][M], g[M];
int mp[N][N];
int n, m;

int main() {
    scanf("%d%d",&n,&m); int Ans = 0;
    for(int i=1,x,y,z;i<=m;++i) {
        scanf("%d%d%d",&x,&y,&z), Ans += z;
        mp[x][y] = mp[y][x] = z;
    }
    for(int s=0;s<bin(n);++s) {
        int&v = g[s];
        for(int i=1;i<=n;++i) if(s & b(i))
        for(int j=i+1;j<=n;++j) if(s & b(j)) v += mp[i][j];
    }
    for(int i=1;i<=n;++i)
    for(int j=0;j<bin(n);++j)
        f[i][j] = -1;

    f[1][1] = 0;
    for(int S=1;S<bin(n);++S)
    for(int i=1;i<=n;++i) if((S & b(i)) and ~f[i][S]) {
        for(int j=1;j<=n;++j) if((~S & b(j)) and mp[i][j]) cmax(f[j][S|b(j)], f[i][S] + mp[i][j]);
        for(int iS=(bin(n)-1)^S, s = iS; s; s = (s-1) & iS)
            cmax(f[i][S|s], f[i][S] + g[s|b(i)]);
    }
    printf("%d\n", Ans - f[n][bin(n)-1]);
    return 0;
}

原文地址:https://www.cnblogs.com/penth/p/11368096.html

时间: 2024-10-10 03:41:34

题解-AtCoder ARC-078F Mole and Abandoned Mine的相关文章

(状压dp)ABC 067 F : Mole and Abandoned Mine

Mole decided to live in an abandoned mine. The structure of the mine is represented by a simple connected undirected graph which consists of N vertices numbered 1through N and M edges. The i-th edge connects Vertices ai and bi, and it costs ciyen (th

AtCoder arc078_d Mole and Abandoned Mine

洛谷题目页面传送门 & AtCoder题目页面传送门 给定一个无向连通带权图\(G=(V,E),|V|=n,|E|=m\)(节点从\(0\)开始编号),要删掉一些边使得节点\(0\)到\(n-1\)有且只有\(1\)条简单路径,求最小的删掉的边的权值和. \(n\in[2,15],m\in\left[n-1,\dfrac{n(n-1)}2\right]\),\(G\)中没有重边或自环. 这个问题显然可以转化为:求最大的删过边之后的图的边权和,再用原图的边权和减去它. 考率删过边之后的图\(G'(

AT2657 Mole and Abandoned Mine

传送门 好神的状压dp啊 首先考虑一个性质,删掉之后的图一定是个联通图 并且每个点最多只与保留下来的那条路径上的一个点有边相连 然后设状态:\(f[s][t]\)代表当前联通块的点的状态为\(s\)和路径结尾的点\(t\) 然后考虑转移,要么拓展一个点作为路径,要么挂一个联通块到当前路径结尾的点上 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #in

题解 [Atcoder ABC 161] A,B,C

题解 [Atcoder ABC 161] A,B,C A: 水题,按题意模拟即可. code: #include<bits/stdc++.h> #define ft(i,l,r) for(register int i=l;i<=r;i++) #define fd(i,r,l) for(register int i=r;i>=l;i--) using namespace std; int a,b,c; int main() { cin>>a>>b>>

【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: 为什么加椅子?我们可以在最左边或最右边一直加直到人人都有座位. 首先这道题目抽象成二分图很简单,然后我们可以只要求解出人与座位的最大匹配是多少,总人数减去即可,但跑二分图最大匹配显然会超时,我们就可以往霍尔定理方面想. 然后你还需要知道一个霍尔定理推论:假设某个人的集合为\(X\),这个集合所对应的

【题解】Atcoder ARC#90 E-Avoiding Collision

自己做出来固然开心,但是越发感觉到自己写题的确是很慢很慢了……往往有很多的细节反反复复的考虑才能确定,还要加油呀~ 这道题目的突破口在于正难则反.直接求有多少不相交的不好求,我们转而求出所有相交的.我们先预处理出由 \(S\) 到 \(T\) 的最短路图(跑一边Dijkstra,所有的最短路径构成的图),显然可以顺便处理出 \(T\) 到 \(S\) 的.然后这个图是一个拓扑图,满足的性质就是从 \(S\) 点出发的任意一条路径终点均为 \(T\) 且为二者之间的最短路.拓扑图dp对于每个点我们

题解 AtCoder abc154 F

题目大意 令 \(f(r,c)=C_{r+c}^r\),要求输出 \(\sum_{i=r_1}^{r_2}\sum_{j=c_1}^{c_2} f(i,j)\),其中 \(r_2,r_2,c_1,c_2\) 为给定值. 分析 令 \[g(r,c)=\sum_{i=0}^r\sum_{j=0}^c f(i,j)\] 则题目所求为 \[\sum_{i=r_1}^{r_2}\sum_{j=c_1}^{c_2} f(i,j)=g(r_2,c_2)-g(r_2,c_1-1)-g(r_1-1,c_2)+g(

[题解]扫雷Mine

// 此博文为迁移而来,写于2014年11月4日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrft.html 1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1730  Solved: 1028[Submit][Status] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据

[AtCoder][ARC082]Sandglass 题解

Sandglass 时间限制: 1 Sec 内存限制: 128 MB 原题链接 https://arc082.contest.atcoder.jp/tasks/arc082_d 题目描述 We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount of sand. When we put the sandglass, either bulb A or B lies