/* 题目不难,一次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; }
140 Bandwidth
最新推荐文章于 2022-02-17 22:31:25 发布