题意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市,给出每一个点相邻的点,求每一个序列。
思路:dfs.
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=21; 10 11 bool To[N][N],vis[N]; 12 int m,cnt; 13 int b[N]; 14 15 void dfs(int s,int t){ 16 if(t==20&&To[s][m]){ 17 printf("%d: ",cnt++); 18 for(int i=1;i<=20;i++) 19 printf("%d ",b[i]); 20 printf("%d\n",m); 21 return ; 22 } 23 for(int i=1;i<=20;i++){ 24 if(!vis[i]&&To[s][i]){ 25 vis[i]=true; 26 b[t+1]=i; 27 dfs(i,t+1); 28 vis[i]=false; 29 } 30 } 31 } 32 33 int main(){ 34 35 // freopen("data.in","r",stdin); 36 // freopen("data.out","w",stdout); 37 38 memset(To,false,sizeof(To)); 39 int x,y,z; 40 for(int i=1;i<N;i++){ 41 scanf("%d%d%d",&x,&y,&z); 42 To[i][x]=true; 43 To[i][y]=true; 44 To[i][z]=true; 45 } 46 while(scanf("%d",&m),m){ 47 cnt=1; 48 memset(vis,false,sizeof(vis)); 49 b[1]=m; 50 vis[m]=true; 51 dfs(m,1); 52 } 53 return 0; 54 }
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=31; 10 const int inf=1<<30; 11 12 int len[N][N]; 13 bool vis[8],flag[N]; 14 int n,k,b[8]; 15 int MIN,cnt; 16 17 void dfs(int s,int t,int sum){ 18 if(t==cnt){ 19 MIN=min(MIN,sum); 20 return ; 21 } 22 for(int i=1;i<=cnt;i++){ 23 if(!vis[i]){ 24 vis[i]=true; 25 dfs(b[i],t+1,sum+len[s][b[i]]); 26 vis[i]=false; 27 } 28 } 29 } 30 31 int main(){ 32 33 // freopen("data.in","r",stdin); 34 // freopen("data.out","w",stdout); 35 36 while(scanf("%d",&n),n){ 37 for(int i=0;i<n;i++) 38 for(int j=0;j<n;j++) 39 scanf("%d",&len[i][j]); 40 scanf("%d",&k); 41 int m; 42 memset(flag,false,sizeof(flag)); 43 for(int i=0;i<k;i++){ 44 scanf("%d",&m); 45 flag[m]=true; 46 } 47 cnt=0; 48 for(int i=1;i<N;i++){ 49 if(flag[i]) 50 b[++cnt]=i; 51 } 52 memset(vis,false,sizeof(vis)); 53 MIN=inf; 54 dfs(0,0,0); 55 printf("%d\n",MIN); 56 } 57 return 0; 58 }