UVa140

/*
因为最多有8个点,因此暴力搜索即可,最多时间复杂度8!
1.按照提议处理数据,首先是读取字符串,处理边关系e[i][j]和标记使用的节点v[i]
2.对于每一种排列,计算每个元素的位置pos[i],方便后面计算每个节点的带宽bd[i]
3.更新结果带宽和对应的排序。
*/#include <iostream>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<sstream>
#include<string.h>
#include<algorithm>
using namespace std;
 
 
char s[100];
int v[26],e[26][26],bd[26],pos[26];
void init(){
    memset(e,0,sizeof(e));
    memset(v,0,sizeof(v));
    memset(pos,0,sizeof(pos));
    int beg=0,end,len=strlen(s);
    while(beg<len){
        v[s[beg]-'A']=1;
        for(end=beg+2;end<len&&s[end]!=';';++end){
            v[s[end]-'A']=1;
            e[s[beg]-'A'][s[end]-'A']=1;
        }
        beg=end+1;
    }
}
int cal(){
    int ans=0;
    memset(bd,0,sizeof(bd));
    for(int i=0;i<26;++i)if(v[i]){
        for(int j=0;j<26;++j)if(e[i][j])bd[i]=max(bd[i],abs(pos[i]-pos[j]));
        ans=max(ans,bd[i]);
    }
    return ans;
}
 
 
int main()
{
    while(scanf("%s",s)&&s[0]!='#'){
        init();
        int ans=30;
        vector<int>ch,order;
        for(int i=0;i<26;++i)if(v[i])ch.push_back(i);
        do{
            for(int i=0;i<ch.size();++i)pos[ch[i]]=i;
            int tmp=cal();
            if(tmp<ans){order=ch;ans=tmp;}
        }while(next_permutation(ch.begin(),ch.end()));
        for(int i=0;i<order.size();++i)printf("%c ",order[i]+'A');
        printf("-> %d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shihongliang1993/article/details/74451943
今日推荐