uva140 - Bandwidth

1745 단어
처음에는 뜻을 이해하지 못했는데...여기 있는 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
",_min); } return 0; }

좋은 웹페이지 즐겨찾기