uva 140 Bandwidth(暴搜+剪枝)

来源:互联网 发布:java int 是多少位的 编辑:程序博客网 时间:2024/04/29 04:34

原题链接:

UVA  140


参考刘汝佳书《算法竞赛入门经典(第二版)》P196.

我是搬运工。


枚举所有可能序列。

找到最终解。


剪枝:当目前最小带宽小于等于正在判断的两个结点距离时,应当剪掉。


注意题目的中 ‘#’ 


代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;const int MAXN=30;const int N=10;int G[MAXN][MAXN];int tempans[N],ans[N];bool flag[MAXN];int main(){string s;while(cin>>s){if(s[0]=='#')break;//奇怪的地方,可能会有第一个数据就是‘#’吧memset(G,0,sizeof(G));memset(flag,0,sizeof(flag));bool p=false;int u;for(int i=0;i<s.length();i++){if(s[i]>='A'&&s[i]<='Z')flag[s[i]-'A']=true;if(s[i]==':'){u=s[i-1]-'A';p=true;}else if(p&&s[i]>='A'&&s[i]<='Z'){G[s[i]-'A'][u]=G[u][s[i]-'A']=1;}else if(s[i]==';'){p=false;}}int k=0;for(int i=0;i<26;i++)//记录下对应的位置{if(flag[i])tempans[k++]=i;}int Min=9;do{int tMin=0;for(int i=0;i<k;i++){for(int j=i+1;j<k;j++){if(G[tempans[i]][tempans[j]])tMin=max(tMin,abs(i-j));}if(tMin>=Min)break;}if(tMin<Min){Min=tMin;memcpy(ans,tempans,sizeof(tempans));}}while(next_permutation(tempans,tempans+k));for(int i=0;i<k;i++)printf("%c ",ans[i]+'A');printf("-> %d\n",Min);}return 0;}




0 0