UVA_140
这个题目首先在读取数据的时候要把所有顶点存放在一个数组里,同时用邻接矩阵把顶点间的关系存储下来。之后对顶点进行升序排序,之所以排序主要是因为题目中要求结果相同时输出字典序最小的方案,而排序之后顺序深搜到的第一个符合要求的解,一定是字典序最小的解。
然后只需要枚举所有排列并进行计算即可。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
int n,a[10],A[10],G[30][30],vis[10],ans[10],res;
char b[100];
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return *p-*q;
}
void dfs(cur)
{
int i,j,temp;
if(cur==n)
{
temp=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(G[A[i]][A[j]]&&j-i>temp)
temp=j-i;
if(temp<res)
{
res=temp;
memcpy(ans,A,sizeof(A));
}
return;
}
for(i=0;i<n;i++)
if(!vis[i])
{
vis[i]=1;
A[cur]=a[i];
dfs(cur+1);
vis[i]=0;
}
}
int main()
{
int i,j,k,hash[30];
while(1)
{
memset(b,'\0',sizeof(b));
scanf("%s",b);
if(b[0]=='#')
break;
n=0;
memset(G,0,sizeof(G));
memset(hash,0,sizeof(hash));
for(i=0;b[i]!='\0';)
{
j=b[i]-'A';
if(!hash[j])
{
hash[j]=1;
a[n++]=j;
}
i+=2;
while(isalpha(b[i]))
{
k=b[i]-'A';
if(!hash[k])
{
hash[k]=1;
a[n++]=k;
}
G[j][k]=G[k][j]=1;
i++;
}
i++;
}
qsort(a,n,sizeof(a[0]),cmp);
memset(vis,0,sizeof(vis));
res=1000000000;
dfs(0);
for(i=0;i<n;i++)
printf("%c ",ans[i]+'A');
printf("-> ");
printf("%d\n",res);
}
return 0;
}