题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1572
好吧,没想到这题用深搜可以搞定。还以为又是一道套dijkstra算法的模板题。
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<29 #define s(a) scanf("%d",&a) #define CL(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=35; int n,m,a,b[N],c; string s1,s2; int Map[N][N]; int dist,num,ans; bool vis[N]; /* 深搜,搜索每一种可能的情况,标记,深一层,回溯。*/ void dfs(int x,int step,int dist) { if(step==num) if(ans>dist) ans=dist; for(int i=1;i<n;i++) if(b[i]){ b[i]=0; dfs(i,step+1,dist+Map[x][i]); b[i]=1; } } int main() { while(~scanf("%d",&n)){ if(n<=0) break; CL(b,0); for(int i=0;i<n;i++) for(int j=0;j<n;j++) s(Map[i][j]); s(m);num=0; for(int i=1;i<=m;i++){ s(a); if(!b[a]){ b[a]=1; num++; } } ans=inf; dfs(0,0,0); printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-13 06:42:03