链接:点击打开链接
题意:给出一个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; }