决定跳过数据结构那章,来看暴力求解法。暴力这章之前也看过,可是前几天做了一道POJ的暴力题,却没有想起来自己曾经在书上看过类似的暴力枚举解法,所以决定再仔细看一遍。感觉要是不刷题,只是单纯的看书的话,记不住啊。
书中也说了,可以剪枝(“发现两个结点的距离大于或等于k”,“如果在搜索到结点u时,u结点还有m个相邻点没有确定位置”),不过这只能跳过当前排列而已,对减少时间复杂度的意义不是太大,所以我就还是贴上自己原本的代码。
前几天买了侯捷的《STL源码剖析》,最近在研究STL,真好用,比如这个题直接用next_permutation,方便极了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxx=100; 7 const int maxn=250; 8 int main() 9 { 10 char s[maxx]={}; 11 while(~scanf("%s",s)&&s[0]!='#') 12 { 13 int len=strlen(s); 14 bool f[maxn]={}; 15 bool mg[maxn][maxn]={}; 16 char a,b; 17 bool f1=0; 18 char v[maxn]={}; 19 int n=0; 20 for(int i=0;i<len;i++) 21 { 22 if(s[i]==':') 23 { 24 f1=1; 25 continue; 26 } 27 if(s[i]==';') 28 { 29 f1=0; 30 continue; 31 } 32 if(!f[s[i]]) 33 { 34 v[n++]=s[i]; 35 f[s[i]]=1; 36 } 37 if(f1==0) a=s[i]; 38 else 39 { 40 b=s[i]; 41 mg[a][b]=mg[b][a]=1; 42 } 43 } 44 sort(v,v+n); 45 char vans[maxn]={}; 46 int ans=1e9; 47 do 48 { 49 int tans=0; 50 for(int i=0;i<n;i++) 51 for(int j=i+1;j<n;j++) 52 if(mg[v[i]][v[j]]) tans=max(tans,j-i); 53 if(tans<ans) 54 { 55 strcpy(vans,v); 56 ans=tans; 57 } 58 }while(next_permutation(v,v+n)); 59 for(int i=0;i<n;i++) printf("%c ",vans[i]); 60 printf("-> %d\n",ans); 61 } 62 }