`
java-mans
  • 浏览: 11340995 次
文章分类
社区版块
存档分类
最新评论

140 Bandwidth

 
阅读更多
/*
题目不难,一次AC
题意:将图中各节点排在一条线上,依次找出各节点到相邻节点的最长距离,各节点最长距离的最大值即为带宽。输出带宽最小的序列,和带宽的值,如果出现多种情况,输出字典序最小的那种。
思路:深搜+回溯+状态存储
*/

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
char line[100];
bool G[30][30],visit[30];
char node[10],A[10],res[10];
int m;
int ans;
int cmp(const void *a,const void *b)
{
	char *pa=(char *)a;
	char *pb=(char *)b;
	return *pa-*pb;
}
void dfs(int cur,int dep)
{
	if(dep==m)
	{
		int temp=0;
		for(int i=0;i<m;i++)
		{
			int k=0;
			int a=A[i]-'A';
			for(int j=0;j<m;j++)
				if(i!=j)
			{
				int b=A[j]-'A';
				if(G[a][b])
				{
					if(abs(i-j)>k)
						k=abs(i-j);
				}
			}
			if(k>temp)
				temp=k;
		}
		if(temp<ans)
		{
			ans=temp;
			memcpy(res,A,sizeof(A));
		}
		return;
	}
	for(int i=0;i<m;i++)
	{
		if(!visit[i])//排列式搜索,所以不需要G[][]值为1.
		{
			A[dep]=node[i];
			visit[i]=1;
			dfs(i,dep+1);
			visit[i]=0;
		}
	}
}
int main()
{
	//freopen("data.in","r",stdin);
	while(1)
	{
		gets(line);
		if(line[0]=='#') break;
		int len=strlen(line);
		int flag=0;
		m=0;
		memset(G,0,sizeof(G));
		memset(visit,0,sizeof(visit));
		int a,b;
		for(int i=0;i<len;i++)
		{
			
			if(line[i]==';')
			{
				flag=0;
				continue;
			}
			else if(line[i]==':')
			{
				flag=1;
				continue;
			}
			else if(!visit[line[i]-'A'])
			{
				visit[line[i]-'A']=1;
				node[m++]=line[i];
			}
			if(flag==0)
				a=line[i]-'A';
			else if(flag==1)
			{
				b=line[i]-'A';
				G[a][b]=G[b][a]=1;
			}
		}
		ans=1e9;
		qsort(node,m,sizeof(node[0]),cmp);
		memset(visit,0,sizeof(visit));
		for(int i=0;i<m;i++)
		{
			A[0]=node[i];
			visit[i]=1;
			dfs(i,1);
			visit[i]=0;
		}
		for(int i=0;i<m;i++)
			printf("%c ",res[i]);
		printf("-> %d\n",ans);
	}
	return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics