Cod sursa(job #283551)

Utilizator alecmanAchim Ioan Alexandru alecman Data 19 martie 2009 12:06:27
Problema Dusman Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 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, k;
int st[ NMAX ];
VI A[ NMAX ];

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);
  }
}

int succesor()
{
  ++st[ k ];
  if(st[ k ] <= N) return 1;
  return 0;
}

int valid()
{
  VI::iterator it;

  for(it = A[ st[ k ] ].begin(); it != A[ st[ k ]].end(); ++it)
    if(st[ k - 1 ] == *it) return 0;

  for(int i = 1; i <= k-1; ++i)
    if(st[ i ] == st[ k ]) return 0;
  return 1;
}

int solutie()
{
  if(k == N) return 1;
  return 0;
}

int main()
{
  int as, ev, cont = 0;

  readData();

  k = 1;
  st[ k ] = 0;

  while( k )
  {
    do{
      as = succesor();
      if(as) ev = valid();
      if((as && ev) || (!as) ) break;
    } while(1);

    if(as)
    {
      if(solutie())
      {
        ++cont;
        if(cont == K)
          for(int i = 1; i <= N; ++i) fprintf(fout, "%d ", st[ i ]);
      }
      else
      {
        ++k;
        st[ k ] = 0;
      }
    }
    else
      --k;
  }

  fclose(fin);
  fclose(fout);

  return 0;
}