uva 140 Bandwidth 带宽

来源:互联网 发布:2015最新网络神曲 编辑:程序博客网 时间:2024/04/29 23:26

题目大意:

这道题很水的,纯暴力都可以过。有点难度也就是题意不好懂。。。

题目给你一个图,表示点和点之间的连接关系,然后让你找到这样的一个字符排序,使得带宽最小。带宽是这样定义的:在字符排序中,相连的点在字符串中的最大距离。这里相连的点就是题目输入的信息,距离指的是在字符串中的距离。

比如ABCFGDHE,题目中给出A和F相连,在这个字符串中的距离就是3,A和B相连,在字符串中的距离就是1。它的带宽为3。是最小的。


#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<string>#include<cstring>#include<math.h>#include<algorithm>#include<assert.h>#include<stdlib.h>#include<stack>#include<vector>#include<map>#include<set>#define pi acos(-1.0)#define ll long longusing namespace std;struct node{    char s;    char e;};node a [100];int main(){   // freopen("in.txt","r",stdin);   // freopen("out.txt","w",stdout);    char tmp[500];    char qi;    int zimu[27]={0};    while(scanf("%s",tmp)&&tmp[0]!='#')    {        int shu;        memset(zimu,0,sizeof(zimu));        int tt=0;        qi=tmp[0];        for(int i=1;i<strlen(tmp);i++)        {            if(tmp[i]==';')            {                qi=tmp[i+1];                continue;            }            if(tmp[i]==':')                continue;            zimu[tmp[i]-'A'+1]=1;            zimu[qi-'A'+1]=1;            a[tt].s=qi;            a[tt++].e=tmp[i];        }        shu=tt;        char ch[30];        tt=0;        for(int i=1;i<=26;i++)            if(zimu[i])                ch[tt++]=char('A'-1+i);        ch[tt]='\0';        sort(ch,ch+tt);        int ans=99999;        int Max=0;        int cixun=0;        string res;        do        {            Max=0;            for(int i=0;i<shu;i++)            {                int temp=abs(strchr(ch,a[i].s)-strchr(ch,a[i].e));                Max=max(Max,temp);                if(Max>=ans)                    break;             }             if(Max<ans)             {                 ans=Max;                 res=ch;             }        }while(next_permutation(ch,ch+tt));        cout<<res[0];        for(int i=1;i<res.size();i++)            cout<<" "<<res[i];        printf(" -> %d\n",ans);    }    return 0;}


0 0