UVA 140

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
char s[1010],rk[30];
int id[1010],n,a[10],b[10],vis[10],ans,ANS[11];
vector<int>v[10];
int dfs(int x,int step){
    if(step==n){
        int sum=-1;
        for(int i=0;i<n;i++){
            for(int j=0;j<v[i].size();j++){
                int to=v[i][j];
                sum=max(sum,abs(b[i]-b[to]));
            }
        }
        if(ans>sum){
            ans=sum;
            memcpy(ANS,a,sizeof(a));
        }
        return 1;
    }
    int cnt=0;
    for(int j=0;j<v[x].size();j++){
        int to=v[x][j];
        if(!vis[to])cnt++;
    }
    if(cnt>ans)/*剪枝1*/
        return 0;
    for(int j=0;j<n;j++){
        if(!vis[j]){
            int f=1;
            for(int i=0;i<v[j].size();i++){
                int to=v[j][i];
                if(vis[to]&&step-b[to]>ans){
                    f=0;
                    break;
                }
            }
            if(!f)continue;//剪枝2
            vis[j]=1;
            b[j]=step;
            a[step]=j;
            dfs(j,step+1);
            vis[j]=0;
        }
    }
}
int main(){
    while(~scanf("%s",s)&&s[0]!='#'){
        n=0,ans=INF;
        for(int i=0;i<9;i++)
            v[i].clear();
        for(int i='A';i<='Z';i++){
            if(strchr(s,i)!=NULL){//如果找得到i字符
                rk[n]=i;
                id[i]=n++;
            }
        }
        int i=0,len=strlen(s);
        while(i<len){
            int x=id[s[i]];
            i+=2;
            while(i<len&&s[i]!=';'){
                int y=id[s[i++]];
                v[x].push_back(y);
                v[y].push_back(x);
            }
            i++;
        }
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++){
            vis[i]=1;
            a[0]=i;
            b[i]=0;
            dfs(i,1);
            vis[i]=0;
        }
        for(int i=0;i<n;i++){
            printf("%c ",rk[ANS[i]]);
        }
        printf("-> %d\n",ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值