hdu1572

来源:互联网 发布:信用卡加淘宝帐号贷款 编辑:程序博客网 时间:2024/05/17 07:28

链接:点击打开链接

题意:给出一个n*n的矩阵每一个数代表第i站到第j站的距离,给出m个人想要到达的站,问给m个人都送到最短距离是多少

代码:

#include <iostream>#include <string.h>#include <stdio.h>#include <limits.h>#include <algorithm>using namespace std;int dis[105][105],vis[105];int n,m,t,ans;void dfs(int num,int sum,int st){               //搜索分别代表搜索到第几个,距离和,和起始点    int i;    if(num==t){        ans=min(ans,sum);        return;    }    for(i=1;i<=n;i++)    if(vis[i]){        vis[i]=0;        dfs(num+1,sum+dis[st][i],i);        vis[i]=1;    }}int main(){    int i,j,k;    while(scanf("%d",&n)!=EOF&&n){              //这个题的路径只能经过给出的几个点,不能含有别的点        ans=INT_MAX;t=0;                        //因此不能求最短路,所以采用暴搜,也可以用STL里全排        memset(vis,0,sizeof(vis));              //列直接暴力求解        for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        scanf("%d",&dis[i][j]);        scanf("%d",&m);        for(i=1;i<=m;i++){            scanf("%d",&k);            if(!vis[k+1]){            t++;            vis[k+1]=1;            }        }        dfs(0,0,1);        printf("%d\n",ans);    }    return 0;}

0 0