//此代码为中级版,尚待修改
#include<iostream>
#include<fstream>
#include<cmath>
#include<cstdlib>
using namespace std;
ifstream fin("C:\\data4.in");
ofstream fout("C:\\data4.out");
int COUNT=0;
char node[8];
int dist[8][8];
int bandwidth[8];
int minroute[8],route[8];
int minBandWidth=32767;
void printArr()
{
cout<<endl;
for(int i=0;i<COUNT;++i)
{
for(int j=0;j<COUNT;++j)
cout<<dist[i][j]<<"\t";
cout<<endl;
}
cout<<endl;
}
void SortArray()
{
char temp[8];
int tempdist[8][8];
int transport[8];
char ch;
memcpy(temp,node,sizeof(node));
for(int i=1;i<COUNT;++i)
{
for(int j=i;j>=0;--j)
{
if(node[j]<node[j-1])
{
ch=node[j];
node[j]=node[j-1];
node[j-1]=ch;
}
}
}
for(int i=0;i<COUNT;++i)
{
int pos;
for(pos=0;node[pos]!=temp[i];++pos);
transport[i]=pos;
}
// printArr();
memcpy(tempdist,dist,sizeof(dist));
memset(dist,0,sizeof(dist));
for(int i=0;i<COUNT;++i)
{
for(int j=0;j<COUNT;++j)
{
if(tempdist[i][j]==1)
dist[transport[i]][transport[j]]=1;
}
}
}
void SearchAllowedRoute(int);
void print();
void Init(string str)
{
memset(dist,0,sizeof(dist));
for(int i=0;i<str.length();++i)
{
int pos;
if(str[i]<='Z'&&str[i]>='A')
{
for(pos=0;pos<8&&node[pos]!=str[i];++pos);
if(pos==8)
{
node[COUNT++]=str[i];
pos=COUNT-1;
}
}
while(str[++i]!=';')
{
char ch=str[i];
if(ch==':')
continue;
int posch;
for(posch=0;posch<8&&node[posch]!=ch;++posch);
if(posch==8)
{
node[COUNT++]=ch;
posch=COUNT-1;
}
dist[pos][posch]=1;
dist[posch][pos]=1;
}
}
SearchAllowedRoute(0);
print();
minBandWidth=32767;
cout<<endl;
//此处尚未成功
SortArray();
SearchAllowedRoute(0);
print();
}
void SearchAllowedRoute(int cnt)
{
if(cnt>=COUNT)
{
int max=0;
for(int i=0;i<COUNT;++i)
{
int pos,temp;
for(int j=0;j<COUNT;++j)
{
if(dist[i][j]==1)
{
for(pos=0;route[pos]!=j;++pos);
temp=abs(i-pos);
if(temp>max)
max=temp;
}
}
}
if(max<minBandWidth)
{
minBandWidth=max;
memcpy(minroute,route,sizeof(route));
}
return;
}
for(int i=0;i<COUNT;++i)
{
if(cnt==0)
{
route[cnt]=i;
SearchAllowedRoute(cnt+1);
continue;
}
bool isExist=false;
for(int j=0;j<cnt;++j)
{
if(i==route[j])
{
isExist=true;
break;
}
}
if(!isExist)
{
route[cnt]=i;
SearchAllowedRoute(cnt+1);
}
}
}
void print()
{
for(int i=0;i<COUNT;++i)
{
cout<<node[minroute[i]]<<"\t";
}
cout<<"-->"<<minBandWidth<<endl;
cout<<endl;
}
void testprint()
{
cout<<endl;
for(int i=0;i<COUNT;++i)
{
for(int j=0;j<COUNT;++j)
{
if(dist[i][j]==1)
cout<<node[j]<<"\t";
else
cout<<0<<"\t";
}
cout<<endl;
}
cout<<endl;
}
int main()
{
string str;
fin>>str;
Init(str);
system("pause");
return 0;
}