关闭

例题 7-6 UVA - 140 Bandwidth 带宽 (全排列暴力)

标签: c语言uva
269人阅读 评论(0) 收藏 举报
分类:

UVA 蹦了  不知道能不能过 先写上在说,不对在改吧!

思路很简单:

直接从输入中建立出一张图,然后全排列枚举图,在每一个全排列中遍历带宽

最后更新答案!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
const int maxn = 200 + 10;
const int INF = 1e9;
vector<int>v[30];
char s[maxn];
int a[30];
int main(){
    while(scanf("%s",s+1) == 1 && s[1] != '#'){
        s[0] = ';';
        int len = strlen(s);
        s[len++] = ';';
        s[len] = 0;
        for (int i = 0; i < 26; ++i)v[i].clear();
        for (int i = 0; i < len; ++i){
            if (s[i] == ';'){
                int u = s[i+1]-'A',j;
                for (j = i + 3; j < len && s[j] != ';'; ++j){
                    int vv = s[j] - 'A';
                    v[u].push_back(vv);
                    v[vv].push_back(u);
                }
                i = j - 1;
            }
        }
        int cnt = 0;
        for (int i = 0; i < 26; ++i)if (!v[i].empty())a[cnt++] = i;
        sort(a,a+cnt);
        int aa[10];
        int ans = INF;
        do{
            int pos[10];
            int band = 0;
            for (int i = 0; i < cnt; ++i)pos[a[i]] = i;
            for (int i = 0; i < cnt; ++i){
                int u = a[i];
                for (int j = 0; j < v[u].size(); ++j){
                    band = max(band,abs(pos[v[u][j]]-pos[u]));
                }
            }
            if (band < ans){
                ans=band;
                memcpy(aa,a,sizeof(int)*10);
            }
        }while(next_permutation(a,a+cnt));
        for (int i = 0; i < cnt; ++i)printf("%c ",aa[i] + 'A');
        printf("-> %d\n",ans);
    }

    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:139773次
    • 积分:7210
    • 等级:
    • 排名:第3283名
    • 原创:602篇
    • 转载:2篇
    • 译文:0篇
    • 评论:35条
    文章分类
    最新评论