思路:存储所有路径,全排列所有点。
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>
#include <cmath>
#include <vector>
#include <utility>
#include <set>
#include <climits>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define INF 2147483647
using namespace std;
typedef long long ll;
typedef pair<char,char > P;
int i,j,n;
int vis[30];
vector <P> v;
string s;
char flag[10];
bool ok1;
int main()
{
while(cin>>s)
{
if(s[0]!='#')
{
char l,r;
int num=0;
memset(flag,0,sizeof(flag));
memset(vis,0,sizeof(vis));
v.clear();
ok1=false;
for(i=0; i<s.size(); i++)
{
if(s[i]==':')
ok1=true;
else if(s[i]==';')
ok1=false;
else
{
if(!ok1)
{
l=s[i];
}
else
{
v.push_back(P(l,s[i]));
}
if(vis[s[i]-'A']==0)
{
flag[num]=s[i];
num++;
vis[s[i]-'A']++;
}
}
}
sort(flag,flag+num);
char path[10];
memset(path,0,sizeof(path));
int min_=INF;
do
{
int sum=1;
int max_=-1;
for(i=0; i<num; i++)
{
for(j=0; j<num; j++)
for(int z=0; z<v.size(); z++)
if(flag[i]==v[z].first&&flag[j]==v[z].second)
if(sum<abs(j-i)+1)
sum=abs(j-i);
if(max_<sum)
max_=sum;
}
if(min_>max_)
{
min_=max_;
for(i=0;i<num;i++)
path[i]=flag[i];
}
}
while(next_permutation(flag,flag+num));
for(i=0; i<num; i++)
{
if(i==0)
printf("%c",path[i]);
else
printf(" %c",path[i]);
}
printf(" -> %d\n",min_);
}
}
return 0;
}