Advertisement
kkleiner

Untitled

Dec 3rd, 2012
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. #include<cstdio>
  2. using namespace std;
  3. int main()
  4. {
  5. int z;
  6. scanf("%d\n", &z);
  7. while(z--)
  8. {
  9.  
  10. short n, m, u, v;
  11. bool graf[16][16] = {0}; //graf[][] - macierz sasiedztwa
  12. scanf("%hd %hd", &n, &m); // n - liczba wiercholkow nie liczac 0-wego, 3<=n<=15, m - liczba krawedzi 1<=m<=100
  13. while(m--)
  14. {
  15. scanf("%hd %hd", &u, &v);
  16. graf[v][u] = true;
  17. graf[u][v] = true; //dziki temu nie musimy odwolujac sie do tabeli szukc wiekszego z indeksow, bo pola symetryczne wzgledem przekatnej [i][i] sa symetryczne
  18. }
  19. bool sciezka[65536][16] = {0};//0 - 65535 - maska bitowa podzbioru ktory rozwazamy, - 15 - wiercholki grafu
  20. sciezka [1][0] = true; //1 - maska bitowa zbioru {0} - w tym zbiorze jest oczywiscie sciezka hamiltona
  21. int A; //A - maska bitowa podzbiru, u,v - wiercholki grafu
  22. for (A = 1; A < (1 << (n+1)); A++) // najwieksza maska bitowa to 2^(n+1) - 1
  23. {
  24. for (u=0; u<=n; u++) //kazdy wierzcholek grafu oprocz 0
  25. {
  26. for (v=0; v<=n; v++)
  27. {
  28. /**/ if (graf[v][u] && ((1<<v)&A) > 0 && ((1<<u)&A) > 0//v i u naleza do A
  29. && sciezka[A^(1<<u)][v]) //sciezka > 0 czyli istenieje sciezka hamiltona w A\{u} do wierzcholka v, w szczegolnosci jesli A\{u} nie zawiera {0}, to sciezka[][] == 0 i wpisac w nwe pole tez powinnismy 0
  30. sciezka[A][u] = true;
  31. }
  32. }
  33. }
  34. //teraz dla A == 2^(n+1) - 1, czyli maski bitowej calego grafu sciezka[A][u] == true <==> istnieje sciezka hamiltona w calym grafie, zaczynajaca
  35. //sie w 0; czyli jezeli dla jakiegokolwiek wierzcholka u : sciezka[A][u] == true istnieje krawedz (O,u) to mamy cykl hamiltona
  36. bool czy_wypisalismy_tak = 0;
  37. A = (1 << (n+1)) - 1; //maska bitowa calego grafu (lacznie z 0 oczywiscie)
  38. for (u=1; u<=n; u++)
  39. {
  40. if (sciezka[A][u] && graf[u][0])
  41. {
  42. printf("TAK\n");
  43. czy_wypisalismy_tak = 1;
  44. break;
  45. }
  46. }
  47. if (!czy_wypisalismy_tak) printf("NIE\n");
  48.  
  49. }
  50. return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement