zoukankan      html  css  js  c++  java
  • hdu1527下沙小面的(二)




    B - 下沙小面的(2)
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

    前文再续,书接上一题。话说当上小面的司机的Lele在施行他的那一套拉客法则以后,由于走的路线太长,油费又贵,不久便亏本了。(真可怜~)于是他又想了一个拉客的办法。 

    对于每一次拉客活动,他一次性把乘客都拉上车(当然也不会超过7个,因为位置只有7个)。然后,Lele计算出一条路线(出于某些目的,Lele只把车上乘客的目的地作为这条路线上的站点),把所有乘客都送到目的地(在这路线上不拉上其他乘客),并且使总路线长度最短。 

    不过Lele每次都要花很多时间来想路线,你能写个程序帮他嘛?

    Input

    本题目包含多组测试。最后一组测试后有一个0代表结束。 
    每组测试第一行有一个整数NCity(3<=NCity<=30)表示下沙一共有多少个站点(站点从0开始标号)。 
    然后给你一个 NCity * NCity 的矩阵,表示站点间的两两距离。即这个矩阵中第 i 行 第 j 列的元素表示站点 i 和站点 j 的距离。(0<=距离<=1000) 
    再然后有一个整数K(1<=K<=7),表示Lele拉上车的人数。 
    接下来的一行里包括 K 个整数,代表上车的人分别要去的站点。(0<站点<NCity) 

    注意: 
    对于每组测试,Lele都是在站点0拉上乘客的。

    Output

    对于每一组测试,在一行内输出一个整数,表示最短路线的长度。

    Sample Input

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

    Sample Output

    4

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int n,m,b[100],c[100],a[100],minlength;
    int map[100][100];
    void dfs(int step,int length,int last)   
    {
        if(step==m)
        {
            minlength=min(length,minlength);
            return;
        }
        else
        {
            for(int i=0; i<m; i++)
                if(!b[i])
                {
                    b[i]=1;
                    dfs(step+1,length+map[last][a[i]],a[i]);
                    b[i]=0;
                }
        }
    }
    int main()
    {
        while(~scanf("%d",&n),n)
        {
            int i,j;
            memset(b,0,sizeof(b));
            memset(c,0,sizeof(c));
            for(i=0; i<n; i++)
                for(j=0; j<n; j++)
                    scanf("%d",&map[i][j]);
            scanf("%d",&m);
            for(i=0; i<m; i++)
                scanf("%d",&c[i]);
            sort(c,c+m);//先排序在去重
            for(j=i=0; i<m-1; i++)
                if(c[i]!=c[i+1])
                    a[j++]=c[i];
            a[j]=c[i];
            m=j+1;
            minlength=0x3f3f3f3f;//最大值
            dfs(0,0,0);
            printf("%d
    ",minlength);
        }
        return 0;
    }
    
    
    
    //#include<iostream>
    //#include<queue>
    //#include<stdio.h>
    //#include<algorithm>
    //using namespace std;
    //int map[31][31],n;
    //int main()
    //{
    //    int i,j,m,sum,a[10],b[10],x;
    //    while(~scanf("%d",&n),n)
    //    {
    //        sum=999999;
    //        for(i=0; i<n; i++)
    //            for(j=0; j<n; j++)
    //                scanf("%d",&map[i][j]);
    //        scanf("%d",&m);
    //        for(i=0; i<m; i++)
    //            scanf("%d",&b[i]);
    //        sort(b,b+m);
    //        b[m]=-1;
    //        for(j=i=0; i<m; i++)
    //            if(b[i]!=b[i+1])
    //                a[j++]=b[i];
    //        m=j;
    //        do
    //        {
    //            x=map[0][a[0]];//计算的是0站和a[0]站的距离
    //            for(i=1; i<m; i++)
    //                x+=map[a[i-1]][a[i]];//以为地图的数据代表的是两站之间的距离,所以可以累加
    //            if(x<sum)
    //                sum=x;
    //        }
    //        while(next_permutation(a,a+m));//等于是遍历输入的站之间的二叉树排列,求出最短的距离
    //        printf("%d
    ",sum);
    //    }
    //    return 0;
    //}



    
  • 相关阅读:
    Linux CentOS7 下设置tomcat 开机自启动
    MYSQL批量导入数据报:[Err] 2006
    HTML页面仿WORD样式
    /usr/bin/ld: cannot find -lxxx 问题
    Linux 重命名
    Linux mail
    cenos 7 mysql
    linux 解压与压缩
    python 字符串替换
    cpu相关信息(进程、线程、核...)
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264927.html
Copyright © 2011-2022 走看看