Cod sursa(job #283557)

Utilizator alecmanAchim Ioan Alexandru alecman Data 19 martie 2009 12:17:45
Problema Dusman Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

#define INPUT "dusman.in"
#define OUTPUT "dusman.out"
#define pb push_back
#define VI vector<int>

const int NMAX = 1001;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

int N, M, K, cont, ending;
int st[ NMAX ], vis[ NMAX ];
VI A[ NMAX ];
VI::iterator it;

void readData()
{
  int X, Y;

  fscanf(fin, "%d %d %d", &N, &K, &M);

  for(int i = 0; i < M; ++i)
  {
    fscanf(fin, "%d %d", &X, &Y);
    A[ X ].pb(Y);
    A[ Y ].pb(X);
  }
}

void back(int P)
{
  int ok;

  if(ending) return;

  if(P == N + 1)
  {
    ++cont;
    if(cont == K) 
      for(int i = 1; i <= N; ++i) fprintf(fout, "%d ", st[ i ]);
  }

  for(int i = 1; i < P; ++i)
    fprintf(stderr, "%d ", st[ i ]);
  fprintf(stderr, "\n");

  for(int i = 1; i <= N; ++i)
    if(!vis[ i ])
    {
      if(P >= 2)
      {
        ok = 1;
        for(it = A[ st[ P-1 ] ].begin(); it != A[ st[ P-1 ] ].end() && ok; ++it)
          if(*it == i) ok = 0;
        if(!ok) continue;
      }
      vis[ i ] = 1;
      st[ P ] = i;
      back( P + 1 );
      if(ending) return;
      vis[ i ] = 0;
    }
}

int main()
{
  readData();

  cont = 0, ending = 0;

  back(1);

  fclose(fin);
  fclose(fout);

  return 0;
}