uva140 - Bandwidth

开始的时候没理解题意,。。。。。以为是此处的order是图的搜索路径呢。

后来理解题意后,由于for循环里的一个小错误,弄了半天。才出了这个题。啊啊啊啊

根据点的每个排序,找出最小带宽。

回溯+剪枝

代码跑了16ms

代码如下:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#define INF 2147483647
using namespace std;
int ve[30][30], node[30], permu[30], ans[30], _min, c;
void analyze(char *s)
{
    int state = 0;
    for(int i = 0;s[i]; i++)
    {
        if(isalpha(s[i]))
        {
            if(!node[s[i]-'A'+1]){node[s[i]-'A'+1] = 1; c++;}
            if(!state) state = s[i]-'A'+1;
            else { ve[state][s[i]-'A'+1] = 1; ve[s[i]-'A'+1][state] = 1;}
        }
        else if(s[i]==';'&&state) state = 0;
    }
}
void dfs(int cur, int max)
{
    if(cur==c)
    {
        if(_min>max) { for(int i = 0; i < c; i++)
        ans[i] = permu[i];  _min = max; }
        return;
    }
    for(int i = 1; i <=26; i++) if(node[i])
    {
        for(int j = cur-max-1; j >= 0; j--) if(ve[i][permu[j]]) max = cur-j;
        if(max>_min) return;
        node[i] = 0; permu[cur] = i; dfs(cur+1, max); node[i] = 1;
    }
}
int main ()
{
    char s[100];
    while(scanf("%s",s)&&s[0]!='#')
    {
        memset(node,0,sizeof(node));
        memset(ve,0,sizeof(ve));
        c = 0;
        analyze(s);
        _min = INF;
        for(int i = 1; i <= 26; i++) if(node[i])
        { node[i] = 0; permu[0] = i; dfs(1,0); node[i] = 1;}
        for(int i = 0; i < c; i++) printf("%c ", ans[i]+'A'-1);
        printf("-> %d\n",_min);
    }
    return 0;
}


你可能感兴趣的:(uva140 - Bandwidth)