计算带宽,就是进行输入处理有一点的麻烦。
枚举所有的排列,算出最大带宽最小的排列。
看算法竞赛入门书上说有剪枝的方法。不知道怎么去写,哪位高人知道的可以指点一下。
#include<stdio.h>
#include<string.h>
#define Arsize 28
int maps[Arsize][Arsize];
int arrays[Arsize];
int order[10];
int a[10];
int ans[10],n,maxband;
int bandwidth(void){
int max,i,u,v,dis,j;
for(i=1,max=0;i<n;i++){
for(j=i+1;j<n;j++){
if(maps[a[i]][a[j]]){
dis=j-i;
if(dis>max)
max=dis;
}
}
}
return max;
}
void dfs(int cur){
int bandwid,i,ok,j;
if(cur==n){
bandwid=bandwidth();
if(bandwid<maxband){
maxband=bandwid;
memcpy(ans,a,sizeof(a));
}
return ;
}
else{
for(i=1;i<n;i++){
ok=1;
a[cur]=order[i];
for(j=1;j<cur;j++){
if(a[j]==a[cur]){
ok=0;
break;
}
}
if(ok)
dfs(cur+1);
}
}
}
int main()
{
char str[100];
char c;
int len,i,pre,now;
while(gets(str)&&strcmp(str,"#")){
n=1;
maxband=8;
len=strlen(str);
memset(maps,0,sizeof(maps));
memset(arrays,0,sizeof(arrays));
memset(order,0,sizeof(order));
for(i=0;i<len;i++){
c=str[i];
if(str[i+1]==':'){
pre=c-'A'+1;
arrays[pre]=1;
}
else if(c>='A'&&c<='Z'){
now=c-'A'+1;
arrays[now]=1;
maps[now][pre]=maps[pre][now]=1;
}
}
for(i=0;i<Arsize;i++){
if(arrays[i])
order[n++]=i;
}
dfs(1);
for(i=1;i<n;i++)
printf("%c ",ans[i]+'A'-1);
printf("-> %d",maxband);
printf("\n");
}
return 0;
}