PICNIC 문제 시간초과가 나네요.

  • techneer
    techneer

    안녕하세요.
    PICNIC 문제를 풀고 있는데요, 로컬에서 돌려보면 답은 잘 나오는데, algospot 에서 제출하면, 계속 시간초과가 납니다. 재귀호출로 했고, 수행회수는 크게 문제 없어 보이는데요. 혹시 잘 아시는 분 있으면 부탁드립니다.

    PICNIC문제 링크

    #include <iostream>
    #include <map>
    #include <utility>
    #include <vector>
    
    using namespace std;
    
    
    int get_pair_count( int n, int depth, vector< pair<int, int> > s_pair, vector<int> flags , vector<int> comb)
    {
        if ( depth == n / 2 )
        {
            vector<int> found(n);
            for ( int i = 0; i < found.size(); i++ )
                found[i] = 0;
    
    
            for ( int i = 0; i < comb.size(); i++ )
            {
                found[ s_pair[comb[i]].first ] = 1;
                found[ s_pair[comb[i]].second ] = 1;
            }
    
            for ( int i = 0; i < found.size(); i++ )
                if ( found[i] == 0 ) return 0;
    
            return 1;
        }
    
        int pair_count = 0;
    
        int start = 0;
        for ( start = s_pair.size() - 1; start >= 0 && flags[start] == -1; start-- );
        start++;
    
        for ( int i = start; i < s_pair.size(); i++ )
        {
            if ( flags[i] == -1 )
            {
                flags[i] = 1;
    
                comb[depth] = i;
                pair_count += get_pair_count( n, depth + 1, s_pair, flags, comb );
    
                flags[i] = -1;
            }
        }
    
        return pair_count;
    }
    
    int main()
    {
        int c;
        int n;
        int m;
    
        vector< pair<int, int> > s_pair;
        vector< int > flags;
        vector< int > comb;
    
        cin >> c;
    
        for (int i = 0; i < c; i++)
        {   
            cin >> n >> m;
    
            for (int j = 0; j < m; j++)
            {
                int s1, s2;
                cin >> s1 >> s2;
                s_pair.push_back( pair<int,int>( s1, s2 ) );
            }
    
            for (int j = 0; j < m; j++)
                flags.push_back( -1 );
    
            for (int j = 0; j < n / 2; j++)
                comb.push_back( -1 );
    
            int count = get_pair_count( n, 0, s_pair, flags, comb );
            cout << count;
    
            s_pair.clear();
            flags.clear();
            comb.clear();
        }
    }
    

    10년 전
1개의 댓글이 있습니다.
  • 일루
    일루

    가능한 가장 큰 케이스를 넣어보니 0.5초 정도의 시간이 걸립니다. 테스트 케이스가 여러 개라면 시간 초과가 날 것 같습니다.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.