坑啊! 注意:
//1
//2
#include<stdio.h>
#include<string.h>
int ans[30];
int node[30];
int gra[30][30];
int numnode;
int min;
void ordering(int* temp,int* dis,int cur)
{
if(cur == numnode)
{
int maxbw=dis[0];
// 1
for(int i=1;i < 30;i++) //i <30, NOT i < numnode(i represents alpha)
{
maxbw = maxbw>dis[i]?maxbw:dis[i];
}
if(maxbw < min)
{
min = maxbw;
memcpy(ans,temp,sizeof(ans));
return;
}
if(maxbw == min)
{
bool small=false;
for(int i=0; i < cur;i++)
{
if(temp[i]!=ans[i])
{
small = temp[i]<ans[i];
break;
}
}
if(small)
memcpy(ans,temp,sizeof(ans));
}
return;
}
for(int i =0; i < 30;i++) //alpha
{
if(node[i]==1)
{
node[i]=2; //alpha i used
temp[cur]=i;
dis[i] =0; //alpha->distance in queue
int flag = true;
int org[30];
memcpy(org,dis,sizeof(org));
for(int j=0;j < 30;j++)
{
if(gra[j][i]&&node[j]==2)
{
int pos;
for(pos =0; temp[pos]!=j;pos++)
continue;
int dist = cur-pos;
if(dist > min)
{
flag=false;
break;
}
dis[j]= dist>dis[j]?dist:dis[j];
dis[i]= dist>dis[i]?dist:dis[i];
}
}
if(flag)
ordering(temp,dis,cur+1);
memcpy(dis,org,sizeof(org)); //back to original //2
node[i]=1;
}
}
}
int main()
{
//
freopen("input.txt","r",stdin);
//freopen("out.txt","w",stdout);
char inp[300];
while(fgets(inp,300,stdin))
{
if(inp[0]=='#')
break;
memset(gra,0,sizeof(gra));
memset(ans,0,sizeof(ans));
memset(node,0,sizeof(node));
min = 9999999;
char* s = inp;
while(true)
{
char* maohao=strchr(s,':');
int i=1;
while(maohao[i]!=';'&& maohao[i]!='\n')
{
gra[*(maohao-1)-'A'][maohao[i]-'A']=1;
gra[maohao[i]-'A'][*(maohao-1)-'A']=1;
node[*(maohao-1)-'A']=1;
node[maohao[i]-'A']=1;
i++;
}
if(maohao[i]=='\n') break;
s = maohao+i;
}
numnode=0;
for(int i=0; i < 30;i++)
{
if(node[i])
numnode++;
}
int temp[30];
int dis[30];
memset(dis,0,sizeof(dis));
ordering(temp,dis,0);
for(int i =0; i < numnode;i++)
{
printf("%c ",ans[i]+'A');
}
printf("-> %d\n",min);
}
}