UVa-140

决定跳过数据结构那章,来看暴力求解法。暴力这章之前也看过,可是前几天做了一道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
",ans);
61     }
62 }
原文地址:https://www.cnblogs.com/windrises/p/4660246.html