zoukankan      html  css  js  c++  java
  • TYVJ 1288 飘飘乎居士取能量块

    背景

    9月21日,pink生日;9月22日,lina生日;9月23日,轮到到飘飘乎居士(狂欢吧,(^__^) 嘻嘻……)。
    描述

    9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番啦!
    为了收集更多的能量到pink家大闹,飘飘乎居士准备从后花园中取出自己多年积攒的p个能量块。后花园一共被划分n个地区,能量块被分散在里面,现在飘飘乎居士拿出地图,发现自己站在1的地方,而他要做的就是用最短的路程把所有的能量块取出,并且最后走到位于n的出口处,而飘飘乎居士一直是个懒人,他想知道最少要走多少路程才能够取到所有的能量块,并且走到出口
    输入格式

    第一行一个正整数n,表示花园被划分成了n个地区
    接下来一个n*n的矩阵,代表个点之间的相互距离,数据保证从i走到i没有路程
    在下来一个整数p,表示一共有p个能量块
    接下来一行,表示各个能量块的位置,数据保证1和n没有能量块,且每个地区最多一个能量块
    对于所有的数据 0< n<=100 0<=P<=10 任意两点的距离为一个小于1000的正整数
    输出格式

    一个数,飘飘乎居士所要行走的最小距离
    测试样例1

    输入

    3
    0 10 1
    3 0 5
    1 2 0
    1
    2
    输出

    7
    备注

    花园被分为3个地区,在2号地区有能量块,飘飘乎居士行走的路线如下
    1->3->2->1->3
    行走的总路程为7,也就是最后的答案。

    思路:
    这里写图片描述
    (感谢lyd学长的幻灯片)

    //By: Sirius_Ren
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int a[105][105],b[105],n,p,minn=0x3fffffff;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d ",&a[i][j]);
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
        scanf("%d",&p);
        for(int i=1;i<=p;i++)scanf("%d",&b[i]);
        sort(b+1,b+p+1);b[0]=1;b[p+1]=n;
        do{
            int sum=0;
            for(int i=1;i<=p+1;i++)sum+=a[b[i-1]][b[i]];
            minn=min(minn,sum);
        }while(next_permutation(b+1,b+p+1));
        printf("%d",minn);
    }
  • 相关阅读:
    Java设计模式-装饰器模式
    【c++内存分布系列】单独一个类
    【转】LCS
    快速排序
    冒泡排序
    选择排序
    多线程读取全局变量
    【转】一致性hash算法(consistent hashing)
    【转】五笔的字典序编码与解码
    给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532448.html
Copyright © 2011-2022 走看看