UVa140

计算带宽,就是进行输入处理有一点的麻烦。

枚举所有的排列,算出最大带宽最小的排列。

看算法竞赛入门书上说有剪枝的方法。不知道怎么去写,哪位高人知道的可以指点一下。

#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;
}


你可能感兴趣的:(UVa140)