UVA 140 Bandwidth

来源:互联网 发布:rxjava gson解析数组 编辑:程序博客网 时间:2024/06/05 23:26

题意:给一个图(V,E),其中V为顶点集合,E为边的集合,给定V中元素的一种排序,则当前排序的带宽是相连接的点的最大距离,一个图可以有多种排序方式,求图的最小带宽,如果最小带宽对应多种排序方式,那么输出字典序小的那个

解题思路:主要是图的存储,将输入的转化为无向图的边,因为排序的方式不是固定的,所以可以用next_permutation()函数进行全排列,用do{...}while...语句,全排列都是按照字典序一个一个往下排的,所以最先符合条件的就是字典序最小的。注意如果用char存储的话最好都用char,不要char、string混用,可能会出现RE

代码:

#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cstdio>#include <cmath>using namespace std;char s[1000];int len;int g[30][30],is[30];void solve(int &i){    int id=s[i]-'A';    i++;    while(i<len&&s[i]!=';')    {        if(s[i]>='A'&&s[i]<='Z')        {            int k=s[i]-'A';            g[id][k]=1;            g[k][id]=1;        }        i++;    }}int main(){    while(gets(s))    {        memset(g,0,sizeof(g));        memset(is,0,sizeof(is));        if(s[0]=='#')break;        len=strlen(s);        int i=0;        while(i<len)        {            if(s[i]>='A'&&s[i]<='Z')solve(i);            i++;        }        char ss[1000];        int cnt=0;        for(int i=0; i<len; i++)        {            if(is[s[i]-'A']==0&&s[i]>='A'&&s[i]<='Z')//存储顶点V,避免重复存储同一个顶点            {                ss[cnt++]=s[i];                is[s[i]-'A']=1;            }        }        sort(ss,ss+cnt);        int ans=1e9;        char str[1000];        do        {            int temp=0;            for(int i=0;i<cnt;i++)            {                for(int j=i+1;j<cnt;j++)                {                    if(g[ss[i]-'A'][ss[j]-'A']==1)                    {                        temp=max(temp,abs(i-j));                    }                }            }            if(temp<ans)            {                ans=temp;                strcpy(str,ss);            }        }        while(next_permutation(ss,ss+cnt));        for(int i=0;i<cnt;i++)        {            cout<<str[i]<<" ";        }        cout<<"-> "<<ans<<endl;    }    return 0;}


原创粉丝点击