/ Randle /

记录详情

Accepted


  
# 状态 耗时 内存占用
#1 Accepted 6ms 4.25 MiB
#2 Accepted 6ms 4.25 MiB
#3 Accepted 5ms 4.25 MiB
#4 Accepted 11ms 4.332 MiB
#5 Accepted 13ms 4.363 MiB
#6 Accepted 4ms 4.199 MiB
#7 Accepted 9ms 4.363 MiB
#8 Accepted 23ms 4.25 MiB
#9 Accepted 10ms 4.359 MiB
#10 Accepted 9ms 4.344 MiB

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bitset>
#define ll long long int
using namespace std;
int n,dis[16][16],f[16][1<<16];
//走到第I个城市 状态为J所花费的最小时间。
int main(){
    memset(dis,0x3f3f3f3f,sizeof(dis));
    memset(f,0x3f3f3f3f,sizeof(f));
    scanf("%d",&n);
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    {
        scanf("%d",&dis[i][j]);
        //if(i==j)dis[i][j]=0x3f3f3f3f;
    }
    for(int k=0;k<=n;k++)
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    if(dis[i][j]>dis[i][k]+dis[k][j])
    dis[i][j]=dis[i][k]+dis[k][j];
    f[0][0]=0;
    for(int i=1;i<(1<<(n+1));i++)//枚举状态
    {
        for(int j=0;j<=n;j++)//枚举目标城市
        {
            if((i|(1<<j))==i)//目标城市走过
            for(int k=0;k<=n;k++)//枚举之前城市
            {
                //如果走过
                f[j][i]=min(f[j][i],f[k][i-(1<<j)]+dis[k][j]);
                //如果没走过
                f[j][i]=min(f[j][i],f[k][i]+dis[k][j]);
            }
        }
    }
    printf("%d",f[0][(1<<(n+1))-1]);
    return 0;
}

信息

递交者
类型
递交
题目
送外卖
题目数据
下载
语言
C++
递交时间
2018-07-29 17:21:39
评测时间
2018-07-29 17:21:39
评测机
分数
100
总耗时
100ms
峰值内存
4.363 MiB