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();
}
}
}
}
}
댓글 없음:
댓글 쓰기