计算带宽,就是进行输入处理有一点的麻烦。
枚举所有的排列,算出最大带宽最小的排列。
看算法竞赛入门书上说有剪枝的方法。不知道怎么去写,哪位高人知道的可以指点一下。
#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; }