uva 140 带宽



#include <iostream>

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#define M 1000

using namespace std;

int G[M][M];
int q[27];
int Count;
int Min;
int cq[27];


void deal(char *s)
{
    int p[M];
    memset(G,0,sizeof(G));
    memset(p,0,sizeof(p));


    char vec;int fv;
    fv = 0;
    int len = strlen(s);
    for(int i = 0;i < len;i++)
    {
        char c = s[i];


        if(isalpha(c))
        {
            p[c-'A'] = 1;
             if(!fv){
               vec = c;
               fv = 1;
             }
             else
              G[c-'A'][vec-'A'] = G[vec-'A'][c-'A'] = 1;
        }
        else if(c == ';')
         fv = 0;
    }


    Count = 0;


    for(int i = 0;i < M;i++)
     if(p[i])
      q[Count++] = i;
}


int main()
{
    //freopen("in.in","r",stdin);


    char str[M];
    while(cin>>str)
    {
        if(str[0] == '#') break;


        deal(str);


        Min = 10000;


        do{
            int ma = 0;


            for(int i = 0;i < Count;i++){
               for(int j = 0;j < Count;j++){
                   if(G[q[i]][q[j]])
                   {
                      int temp = (j - i) > 0? (j-i):(i-j);
                      if(ma < temp)
                       ma = temp;
                       break;
                   }
               }
               if(ma > = Min)//已经找到Min时,当发现已有两个点的距离大于等于Min时再怎么扩展也不可能比当前解更优,剪掉
                break;
            }


            if(ma < Min)
            {
                Min = ma;
               memcpy(cq,q,sizeof(int)*Count);

            }


        }while(next_permutation(q,q+Count));


        for(int i = 0;i < Count;i++)
         printf("%c ",cq[i]+'A');
        cout<<"-> ";


        cout<<Min<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值