您的位置:首页 > 其它

UVa140 - Bandwidth

2015-02-12 23:36 218 查看
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
using namespace std;
const int maxn = 30;
int a[maxn],b[maxn],n,best,k[10]={1};
bool g[maxn][maxn],vis[maxn];
bool read(){
    char c=0,d=0;
    best=1<<30,n=0;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(g,0,sizeof(g));
    memset(vis,0,sizeof(vis));
    while(d!='\n'){
        c  = getchar();
        if(c=='#') return false;
        if(!vis[c-'A']) ++n,vis[c-'A']=true;
        getchar();
        while(isupper(d=getchar())){
            if(!vis[d-'A'])++n,vis[d-'A']=true;
            g[c-'A'][d-'A']=true;
            g[d-'A'][c-'A']=true;
        }
    }
    return true;
}
int get_bw(){
    int bw=0;
    for(int i=0; i<n; ++i){
        if(!vis[a[i]]) continue;
        for(int j=0; j<n; ++j){
            if(!vis[a[j]]) continue;
            if(g[a[i]][a[j]])
                bw=max(abs(i-j), bw);
            if(bw>best) return bw;
        }
    }
    return bw;
}
void solve(){
    int sum=k
;
    for(int i=0,j=0; i<n; ++i){
        while(!vis[j]) ++j;
        a[i]=j++;
    }
    for(int i=0; i < sum; ++i){
        int t=get_bw();
        if(best>t){
            for(int j=0; j<n; ++j)
                b[j]=a[j];
            best=t;
        }
        next_permutation(a,a+n);
    }
    return;
}
int main()
{
    for(int i=1; i<10; ++i) k[i]=i*k[i-1];
    while(read()){
        solve();
        for(int i=0; i<n; ++i)
            printf("%c ",b[i]+'A');
        printf("-> %d\n",best);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: