Posts List

2013년 8월 10일 토요일

Picnic


Correct answer


#include <stdio.h>
#include <vector>

using namespace std;
void sub(vector<int> v, int N, int start);

int c, n, m;
int in[50][2];
int ans;

int relation[10][10];

int main ()
{
    int i,j;
    int tmp;

    // C = number of test case
    scanf("%d", &c);
    //printf("%d\n", c);

    for (i=0; i<c; i++) {
  for (int x=0; x<10; x++)
  for (int y=0; y<10; y++)
  relation[x][y] = 0;

        // n = number of student
        // m = number of pair
        scanf("%d %d", &n, &m);
        //printf("n = %d, m = %d\n", n,m);
        for (j=0; j<m; j++) {
            // in = array of pair
            scanf("%d %d", &in[j][0], &in[j][1]);

            if (in[j][0] > in[j][1])    {
                tmp = in[j][1];
                in[j][1] = in[j][0];
                in[j][0] = tmp;
            }
            
            // in[][0] < in[][1] is always TRUE
            //printf("(%d, %d) ", in[j][0], in[j][1]);
            relation[in[j][0]][in[j][1]] = 1;
        }

  vector<int> v;
  ans = 0;
  sub(v, n, 0);
        //printf("\n");

  printf("%d", ans);

  if (i < c-1) printf("\n");
    }
}

void sub(vector<int> v, int N, int start)
{
 if (v.size() == N)
 {
  ans++;
  return;
 }

 for(int from=start; from<N; from++)
 {
  for(int to=from+1; to<N; to++)
  {
   if( relation[from][to]==1 )
   {
    // check if vector has from or to
    bool bDup = false;
    for (int ii=0; ii<v.size(); ii++) {
     if(v.at(ii)==from || v.at(ii)==to) {
      bDup = true;
      break;
     }
    }

    if (bDup == false)
    {
     v.push_back(from);
     v.push_back(to);
     sub(v, N, from+1);
     v.pop_back();
     v.pop_back();
    }
   }
  }
 }
}

댓글 없음:

댓글 쓰기