AT2657 Mole and Abandoned Mine

传送门

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

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
void read(int &x){
    char ch;bool ok;
    for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
    for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
}
#define rg register
const int maxn=1<<16;
int n,m,v[20][20];
long long ans,in[maxn],f[maxn][20];
vector<int>d[20];
int main(){
    read(n),read(m);
    for(rg int i=1,x,y,z;i<=m;i++){
        read(x),read(y),read(z),v[x][y]=v[y][x]=z;
        ans+=z;
        d[x].push_back(y),d[y].push_back(x);
    }
    int tot=1<<n;
    for(rg int i=0;i<tot;i++){
        for(rg int j=1;j<=n;j++)
            if(!(i&(1<<(j-1)))&&!in[i|(1<<(j-1))]){
                int w=d[j].size(),sum=in[i];
                for(rg int k=0;k<w;k++)
                    if(i&(1<<(d[j][k]-1)))sum+=v[j][d[j][k]];
                in[i|(1<<(j-1))]=sum;
        }
    }
    memset(f,-1,sizeof f);
    f[1][1]=0;
    for(rg int i=0;i<tot;i++)
        for(rg int k=1;k<=n;k++){
            if(f[i][k]==-1)continue;
            if(i&(1<<(k-1))){
                for(rg int j=1;j<=n;j++)
                    if(!(i&(1<<(j-1)))&&v[k][j])
                        f[i|(1<<(j-1))][j]=max(f[i][k]+v[k][j],f[i|(1<<(j-1))][j]);
                int now=((tot-1)^i)|(1<<(k-1));
                for(rg int j=now;j;j=(j-1)&now)
                    if(j&(1<<(k-1)))f[i|j][k]=max(f[i][k]+in[j],f[i|j][k]);
            }
        }
    printf("%lld\n",ans-f[tot-1][n]);
}

原文地址:https://www.cnblogs.com/lcxer/p/10719030.html

时间: 2024-10-29 14:53:06

AT2657 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 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\) 的路径,

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'(

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

hdu 5723 Abandoned country 最小生成树+子节点统计

Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3006    Accepted Submission(s): 346 Problem Description An abandoned country has n(n≤100000) villages which are numbered from 1

MINE

MINE MINE is an app for the nearly 1.2 million songwriters, composers, musicians, and publishers who are registered with any designated P.R.O (SESAC, ASCAP, BMI), and the nearly 6.5 million DIY songwriters and musicians aspiring to profit from publis

1088: [SCOI2005]扫雷Mine

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 979[Submit][Status] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些

mine layer(2008 World Final C)

类似于扫雷游戏,在一些格子中散步着一些地雷,具体的埋藏位置并不清楚,但知道每个格子及其周围八个格子的地雷总数.请问此时正中间哪一行最多可能有多少地雷(题目假定所有的输入都是奇数行的)? 限制条件 输入有R行C列 small R=3,5 3≤C≤5 Large 3≤R≤49,R是奇数 3≤C≤49 样例1 输入 R=3,C=3 2 2 1 3 4 3 2 3 2 输出 1(地雷的分布只有右图一种) 样例2 输入 R=3,C=3 各个格子的信息如下 2 2 1 3 4 3 2 3 2 输出 1(对应

[BZOJ 1088][SCOI2005]扫雷Mine

Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. Input 第一行为N,第二行有N个数,依次为第二列的格