【题解】P1171 售货员的难题

Tags

搜索,状压?。


裸的旅行商问题

#include <stdio.h>
#include <string.h>
#define re register
#define GC getchar()
#define Clean(X,K) memset(X,K,sizeof(X))
#define U unsigned
#define Min(X,Y) (X<Y?X:Y)
short Qread () {
    short X = 0 ;
    char C = GC ;
    while (C > ‘9‘ || C < ‘0‘) C = GC ;
    while (C >=‘0‘ && C <=‘9‘) {
        X = X * 10 + C - ‘0‘ ;
        C = GC ;
    }
    return X ;
}
const short Maxn = 20 , INF = (1 << 15) - 1;
U short int A[Maxn][Maxn] , N ;
short F[Maxn][1 << Maxn];
void DFS (short Now , U X) {
    if (F[Now][X] != -1) return ;
    F[Now][X] = INF;
    for (re int i = 0 ; i < N; ++ i) {
        if ((X & (1 << i)) && Now != i) {
            DFS (i , X & (~ (1 << Now))) ;
            F[Now][X] = Min (F[Now][X] , A[i][Now] + F[i][X & (~ (1 << Now))]) ;
        }
    }
}
int main () {
    //freopen ("P1171.in" , "r" , stdin) ;
    N = Qread () ;
    for (re int i = 0 ; i < N; ++ i) for (re int j = 0 ; j < N; ++ j) A[i][j] = Qread () ;
    Clean (F , -1) ;
    F[0][1] = 0 ;
    for (re int i = 0 ; i < N; ++ i) DFS (i , (1 << N) - 1) ;
    int Ans = INF ;
    for (re int i = 0 ; i < N; ++ i) Ans = Min (Ans ,A[i][0] + F[i][(1 << N) - 1]) ;
    printf ("%d\n" , Ans) ;
    fclose (stdin) , fclose (stdout) ;
    return 0 ;
}

原文地址:https://www.cnblogs.com/bj2002/p/10588204.html

时间: 2024-11-10 18:00:19

【题解】P1171 售货员的难题的相关文章

P1171 售货员的难题 - 状压DP【最短Hamilton路径】

P1171 售货员的难题 Sol: 最短Hamilton路径,经典的NPC问题,小数据可以通过状压DP 实现. 状态:\(f[i][j]\)表示当前在第i号点,且已经过的点的状态为j 时的最短Hamilton路径. 阶段:若以点为阶段,由于会从点i转移到点i+1,还可能从i+1转移到i-1,不具有无后效性,因此我们考虑以二进制状态为阶段进行转移. 决策:考虑由哪一个点转移而来. 转移:\(f[i][j]=\max \limits_{i\&(1<<i)\&\&i\&

P1171 售货员的难题 喻队状压 DP

题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入输出格式 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入输出样例 输入样例#1: 3 0 2 1 1 0 2 2 1 0

P1171 售货员的难题--搜索(剪枝)

题目背景 数据有更改 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s<1000)是已知的,且AA村到BB村与BB村到AA村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为11,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入输出格式 输入格式: 村庄数nn和各村之间的路程(均是整数). 输出

P1171 售货员的难题 暴力dp

题面 著名的TSP问题,NPC问题 对于数据大的情况,我们可以使用一系列近似算法进行寻找解. 对于数据规模小的情况,我们可以直接暴力dp 一开始写了一个dfs,然后就被n=20的数据卡爆了 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using std::min; const int maxn=22; int f[1<<maxn][maxn];

2596 售货员的难题

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Inpu

codevs2596 售货员的难题(状压dp)

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Input D

2596 售货员的难题 水深搜

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Input D

售货员的难题

Description 某乡有n个村庄(1< n < 20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. Input 村庄数n和各村之间的路程(均是整数). Output 最短的路程 Sample Input 3 {村庄数} 0 2 1

状压DP [SWUST OJ 411] 售货员的难题

售货员的难题(0411) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 1744 Accepted: 200 Description 某乡有n个村庄(1< n < 20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为 1,他不知道选择什么样的路线才