首页 > 其他 > 详细

uva140 - Bandwidth

时间:2014-06-25 17:33:48      阅读:278      评论:0      收藏:0      [点我收藏+]

题意:给一个最多8个结点的无向图,把结点重排后对于图中每条边(u,v),u和v在排列中的最大距离称为该排列的带宽。求带宽最小的排列
算法:枚举全排列。需要注意的是本题的输入格式相对麻烦一点,需要仔细应对

学习点:

1. id和letter的映射关系处理

2. strtok函数使用方法

3.for(int i=0;i<n;i++) pos[P[i]]=i; 确认排列中元素位置

 

#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=10;
int id[256], letter[maxn];
int n;

void map_id_letter(char *p) 
{
    n=0;
    for(int c=A; c<=Z; c++) if(strchr(p, c)) 
    {
        id[c]=n;
        letter[n]=c;
        n++;
    }
}

int main()
{
    char buff[256];
    while(gets(buff) && buff[0]!=#)
    {
        map_id_letter(buff);
        char*p=strtok(buff, ";");
        vector<int> u,v;
        while(p)
        {
            //printf("%s\n", p);
            int t=p[0];
            ++p;//跳过:
            while(*(++p))
            {
                u.push_back(id[t]);
                v.push_back(id[*p]);
            }
            p=strtok(0, ";");
        }

        int ans=n;
        int P[maxn], bestP[maxn], pos[maxn];
        for(int i=0;i<n;i++) P[i]=i;
        do
        {
            for(int i=0;i<n;i++) pos[P[i]]=i;
            int bandwidth=0;
            for(int i=0;i<u.size();i++)
            {
                bandwidth=max(bandwidth, abs(pos[u[i]] - pos[v[i]]));
            }
            if(bandwidth<ans)
            {
                ans=bandwidth;
                memcpy(bestP, P, sizeof(P));
            }
        }while(next_permutation(P, P+n));

        for(int i=0;i<n;i++)
        {
            printf("%c ", letter[bestP[i]]);
        }
        printf("-> %d\n", ans);
    }
    
    return 0;
}

uva140 - Bandwidth,布布扣,bubuko.com

uva140 - Bandwidth

原文:http://www.cnblogs.com/cute/p/3806164.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!