首页 > 其他分享 >ABC338 F Negative Traveling Salesman 题解

ABC338 F Negative Traveling Salesman 题解

时间:2024-01-28 12:55:43浏览次数:34  
标签:ABC338 min int 题解 Negative -- Salesman dp

Question

ABC338 F Negative Traveling Salesman

给出一个 \(N\) 个点 \(M\) 条边的有向图,边权可能为负数,但不可能有负环

每经过一条边就要加上这条边的代价

求,一条路径经过所有的点,并且要求总代价最小

Solution

观察到 \(N\le 20\) 自然而然想到状压

因为多次经过一条边的代价是可以重复计算的,那么我们只需要考虑几个关键点就好了

比如说 \(1\Rightarrow 3\) 要经过 \(2\),但是 \(2\) 不是关键节点,\(1\) 和 \(3\) 是

用 Floyd 计算出每两个节点之间的最短路

然后定义 \(F[S][k]\) 表示,在 \(S\) 的状态下,最后一时刻在 \(k\) 的最小代价

转移也很简单,枚举一个在 \(S\) 中的节点 \(j\),把 \(j\) 从 \(S\) 中减去的集合称为 \(S-j\)

\[F[S][j]=\min_{j\in S}\{F[S-j][k]+dis(k,j)\} \]

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1ll<<60;
int n,m,dp[1<<20][21];
int dist[21][21];
signed main(){
    for(int S=0;S<(1<<20);S++)
        for(int j=0;j<21;j++)
            dp[S][j] = INF;
    for(int i=0;i<21;i++)
        for(int j=0;j<21;j++)
            dist[i][j] = INF;
    cin>>n>>m;
    while(m--){
        int x,y; cin>>x>>y; x--; y--;
        int z; cin>>z; dist[x][y] = min(dist[x][y],z);
    }

    //Floyd
    for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);

    for(int i=0;i<n;i++)
        dp[1<<i][i] = 0; //初始化
    
    for(int S=1;S<(1<<n);S++)
        for(int j=0;j<n;j++)
            if((S>>j)&1)  //S 集合中有 j
                for(int k=0;k<n;k++)
                    if((S^(1<<j))>>k&1)  //S-j 集合中有 k
                        dp[S][j] = min(dp[S][j],dp[S^(1<<j)][k]+dist[k][j]);
    
    int ans = 1e9;
    for(int i=0;i<n;i++)
        ans = min(ans,dp[(1<<n)-1][i]);
    if(ans == 1e9) cout<<"No"<<endl;
    else cout<<ans<<endl;
    return 0;
}

标签:ABC338,min,int,题解,Negative,--,Salesman,dp
From: https://www.cnblogs.com/martian148/p/17992750

相关文章

  • CF1423G Growing flowers题解
    考虑每种颜色的贡献,用总数\(n-k+1\)减去没有贡献到的(极长连续段长度为\(len\)时),贡献为\(\max(len-k+1,0)\),所以考虑用\(\text{ODT}\)维护所有颜色的连续段。具体的,维护一个大的\(ODT\)存储所有连续段,再对每个颜色存储自己的连续段,用\(\text{BIT}\)维护每个长度的极长......
  • ABC338 D Island Tour 题解
    Question有\(n\)座海岛由\(n\)条桥连着,第\(i\)座桥连接第\(i\)和\(i+1\)座海岛,第\(n\)座桥连接第\(n\)和\(1\)座海盗有一条长度为\(m\)的旅游路线,第\(X_i\)表示依次到达的岛屿现在需要切断一条桥,求总旅游路线最小值Solution显然,从第\(X_{i-1}\)到\(X_......
  • ABC338 E Chords 题解
    Question一个圆上有\(2N\)个点均匀分布,给出\(N\)条线,每条线连接两个顶点问,有没有两条线相交Solution也算一个比较典的题目考虑到这种两两配对,配对中有没有交错关系的可以考虑异或哈希因为一个数异或两次等于它本身,所以我们可以用异或来实现一个“撤销”操作我们当我......
  • UVA10852 的题解
    UVA10852的题解题目大意给定自然数\(n(100\leqn\leq10000)\),寻找质数\(x\len\),使得\(p\timesx\leqn<(p+1)\timesx\)且\(n-p\timesx\)最大。思路不难发现,\(p\)其实就是$\left\lfloor\frac{n}{x}\right\rfloor$,所以,我们只要找到对应的\(x\),\(p\)的只就......
  • 洛谷题解-P3003 [USACO10DEC] Apple Delivery S (dijkstra)
    题目描述Bessiehastwocrispredapplestodelivertotwoofherfriendsintheherd.Ofcourse,shetravelstheC(1<=C<=200,000)cowpathswhicharearrangedastheusualgraphwhichconnectsP(1<=P<=100,000)pasturesconvenientlynumb......
  • CF765F Souvenirs 题解
    题目链接:CF或者洛谷想了很久,然后想起做过的一道题:秃子酋长,一开始以为差不多,结果写着写着就发现不对劲了。最后写出了个神仙回滚莫队解法,感觉很妙,记录下。进入神仙分析时刻首先,我们来考虑一个事实,加上一个数以后,如果能找到它的前后驱,那么可以立马更新最优解,这个也即是瓶颈点。......
  • ABC338 题解(A-E)
    前言:F,G后续补充。A题意判断一个字符串,是否满足只有第一位为大写字母,其余为小写字母。Sol字面意思模拟即可。Code#include<bits/stdc++.h>#definelllonglong#defineN200005#defineendl"\n"#definefifirst#definesesecondusingnamespacestd;constll......
  • AndroidStudio 编辑xml布局文件卡死问题解决
    之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在解析布局文件时候因为有版权声明的原因导致卡死,所以删除版权声明就可以了。可以......
  • 洛谷题解-P1821 [USACO07FEB] Cow Party S
    https://www.luogu.com.cn/problem/P1821题目描述寒假到了,nnn头牛都要去参加一场在编号为xxx的牛的农场举行的派对,农场之间有mmm条有向路,每条路都有一定的长度。每头牛参加完派对后都必须回家,无论是去参加派对还是回家,每头牛都会选择最短路径,求这nnn头牛的最短路径(一个......
  • 洛谷题解-P1673 [USACO05FEB] Part Acquisition S
    https://www.luogu.com.cn/problem/P1673题目描述奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤5×104)N(1\leN\le5\times10^4)N(1≤N≤5×104)颗行星,在行星上进行交易。为了方便,奶牛们已经给可能出现的K(1≤K≤103)K(1\leK\le10^3)K(1≤K≤103)......