codevs2800 送外卖

题目描述 Description

有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上。n个不同的客户分别在1~n个编号的城市中。送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少。现在已知任意两个城市的直接通路的时间。

输入描述 Input Description

第一行一个正整数n (1<=n<=15)

接下来是一个(n+1)*(n+1)的矩阵,矩阵中的数均为不超过10000的正整数。矩阵的i行j列表示第i-1号城市和j-1号城市之间直接通路的时间。当然城市a到城市b的直接通路时间和城市b到城市a的直接通路时间不一定相同,也就是说道路都是单向的。

输出描述 Output Description

一个正整数表示最少花费的时间

样例输入 Sample Input

3
0 1 10 10
1 0 1 2
10 1 0 10
10 2 10 0

样例输出 Sample Output

8

数据范围及提示 Data Size & Hint

1<=n<=15

/*
把去过哪个城市压成一个数,表示状态,然后跑最短路(其实也可以直接dp递推,但是最短路更自然)
主要codevs上有一个sb测试点,16*16的矩阵他给了个15*15的,对付什么样的sb数据用什么样的sb办法
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct orz{
    int d,p1,p2;
    friend bool operator < (orz a,orz b){
        return a.d > b.d;
    }
};
int n,e[25][25],d[1<<17][17];
priority_queue < orz > ss;
int flag = 0,vis[1<<17][17];
int read(){
    char ch=getchar();
    int x=0,f=1;
    while(!(ch>=‘0‘&&ch<=‘9‘)){if(ch==‘-‘)f=-1;ch=getchar();};
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+(ch-‘0‘);ch=getchar();};
    return x*f;
}
void floyd(){
    for(int k = 0;k <= n;k++){
        for(int i = 0;i <= n;i++){
            for(int j = 0;j <= n;j++){
                if(k != i && k != j && i != j && e[i][j] > e[i][k] + e[k][j]){
                    e[i][j] = e[i][k] + e[k][j];
                }
            }
        }
    }
}
void dij(){
    d[0][0] = 0;
    orz tmp;
    tmp.d = 0;
    tmp.p1 = tmp.p2 = 0;
    ss.push(tmp);
    flag++;
    int to1,to2,dd,tlg;
    while(!ss.empty()){
        tmp = ss.top();
        ss.pop();
        dd = tmp.d;
        to1 = tmp.p1;
        to2 = tmp.p2;
        if(vis[to1][to2] == flag) continue;
        vis[to1][to2] = flag;
        for(int nxt = 0,lg = 1;nxt <= n;lg <<= 1,nxt++){
            tlg = (lg >> 1);
            if(!(to1 & tlg) && d[to1+tlg][nxt] > d[to1][to2] + e[to2][nxt]){
                d[to1+tlg][nxt] = d[to1][to2] + e[to2][nxt];
                tmp.d = d[to1+tlg][nxt];
                tmp.p1 = to1+tlg;
                tmp.p2 = nxt;
                ss.push(tmp);

            }
        }
    }
}
int main(){
    n = read();
    //bool bg = true;
    for(int i = 0;i <= n;i++){
        for(int j = 0;j <= n;j++){
            e[i][j] = read();
            //if(i == 0 && j > 0 && e[i][j] != 1) bg = false;
        }
        /*if(i > 0 && n == 15 && bg){
            cout<<13;
            return 0;
        }*/
    }
    memset(d,127/3,sizeof(d));
    floyd();
    dij();
    cout<<d[(1<<n)-1][0];
    return 0;
}
时间: 2024-10-14 11:48:19

codevs2800 送外卖的相关文章

codevs2800送外卖题解

题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<=n<=15) 接下来是一个(n+1)*(n+1)的矩阵,矩阵中的数均为不超过10000的正整数.矩阵的i行j

codevs 2800 送外卖 TSP问题

2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n 个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知 任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<=

2800 送外卖

2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<

送外卖

[题目描述] 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点,现在已知任意两个城市的直接通路的时间,请问最短时间是多少. [输入描述] 第一行一个正整数n(1 <= n <= 15): 接下来是一个(n+1)*(n+1)的矩阵,矩阵中的数均为不超过10000的正整数.矩阵的i行j列表示第i-1号城市和j-1号城市之间直接通路的时间.当

CODEVS_2800 送外卖 状态压缩+动态规划

原题链接:http://codevs.cn/problem/2800/ 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一次(一个城市可以走多次),最后还要回到0点(他的单位),请问最短时间是多少.现在已知任意两个城市的直接通路的时间. 输入描述 Input Description 第一行一个正整数n (1<=n<=15) 接下来是一个(n+1)

其它容器中,sd::forward_lis中的emlac天津交警出招治理送外卖交

导读:谭铁牛院士在第十九次中科院院士大会上发表了<人工智能:天使还是魔鬼>的主题报告,深度解读了60多年来人工智能发展历史,人工智能的七大现状,发 ? ? ? ? Cmd命令框执行进入至'MQ文件夹\bin'下,然后执行'sar mqnamesrvcmd',启动NAMESERVER.成功后会弹出提示框,此框勿关闭. 32 启动 每一个优秀的工程师可能都有一个硅谷梦,在全球顶级的互联网公司,和最优秀的工程师一起,做最酷的事情.这里,我希望能通过自己最近找工作的经历,帮助大 Daase API是T

揭秘Facebook官方底层C++函数Foll天津交警出招治理送外卖

由于第一次接触WDF驱动开发,因此底层驱动基于微软提供的PCI9056驱动例子(因PCIe和PCI配置空间基本一致,故对9056例子做适当修改便可直接安装使用). 驱Sring boo官方对于Tymeleaf模板提供了很好的支持,但默认不开通Tymeleaf模板,需要手动配置. 支持Tymeleaf模板 maven添加支持如下: deendency 踏过无数坑之后,终于安装成功了caffe,在此记录一下安装过程,带大家飞过各种坑! 1首先先看一下机器是什么类型的显卡: 机器悲剧的没有NVIDIA

三年高级工程师,六年架构师,十二年美团送外卖,程序员的职业发展之路

今天网上闲逛,看到前段时间虎扑上的一篇热贴,<一年前,我月薪两万被人叫老总,如今35岁在美团送外卖>.讲的是一个新媒体公司从业者人到中年的人生境遇.做为一个十七年的程序员老兵,看得我也是心有感触.记得前段时间看到一篇类似的文章,一个35岁的名牌大学研究生,到BAT去面试,被人家像垃圾一样赶出来.还有一篇在华为工作十年,月薪数万的工程师,被华为劝退之后,连一万月薪的工作都找不到. 为什么这类文章会越来越多?中国互联网开始的时候是00年左右,真正发力的时候也就是05年左右,算下来这波工程师到现在差

「美团 CodeM 初赛 Round B」送外卖2---------------状压dp

题目描述 一张 n 个点 m 条有向边的图上,有 q  个配送需求,需求的描述形式为 (si,ti,li,ri)( s_i , t_i , l_i , r_i )(si?,ti?,li?,ri?),即需要从点 si 送到 ti, 在时刻 li 之后(包括 lil_ili? )可以在 sis_isi? 领取货物,需要在时刻 ri 之前(包括 ri)送达 ti ,每个任务只需完成一次. 图上的每一条边均有边权,权值代表通过这条边消耗的时间.在时刻 000 有一个工作人员在点 1 上,求他最多能完成多