Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. /*************************************************************************
  2. * *
  3. * XX Olimpiada Informatyczna *
  4. * *
  5. * Zadanie: Morskie opowiesci *
  6. * Autor: Mateusz Baranowski *
  7. * Zlozonosc czasowa: O(k(n + m)) *
  8. * Zlozonosc pamieciowa: O(n + m + k) *
  9. * Opis: Rozwiazanie wolne *
  10. * Sprawdza kazda opowiesc osobno *
  11. * *
  12. *************************************************************************/
  13.  
  14. #include <cstdio>
  15. #include <vector>
  16. #include <algorithm>
  17. using namespace std;
  18.  
  19. #define MAX_N 10000
  20. #define MAX_M 10000
  21. #define MAX_K 1000000
  22. #define INFTY 1000000000
  23.  
  24. typedef pair< pair<int, int>, int> przygoda_t;
  25.  
  26. int n, m, k;
  27. vector<int> szlaki[MAX_N + 1];
  28. vector<przygoda_t> przygody;
  29.  
  30. void wczytaj_dane() {
  31. scanf("%d %d %d", &n, &m, &k);
  32. int u, v, len;
  33. for (int i = 0; i < m; ++i) {
  34. scanf("%d %d", &u, &v);
  35. szlaki[u].push_back(v);
  36. szlaki[v].push_back(u);
  37. }
  38. for (int i = 0; i < k; ++i) {
  39. scanf("%d %d %d", &u, &v, &len);
  40. przygody.push_back(make_pair(make_pair(u, v), len));
  41. }
  42. }
  43.  
  44. bool sprawdz_przygode(przygoda_t przygoda) {
  45. int a = przygoda.first.first;
  46. int b = przygoda.first.second;
  47. int c = przygoda.second;
  48. int odl[2][2 * MAX_N + 1];
  49. for (int l = 0; l <= n; ++l) {
  50. odl[0][l] = INFTY;
  51. odl[1][l] = INFTY;
  52. }
  53. int pocz[2], kon[2], q[2][MAX_N];
  54. pocz[0] = 0;
  55. kon[0] = 1;
  56. pocz[1] = 0;
  57. kon[1] = 0;
  58. q[0][0] = a;
  59. int k = 0;
  60. int d = 1;
  61. while (pocz[k] < kon[k] && odl[c%2][b] == INFTY) {
  62. int u = q[k][pocz[k]++];
  63. vector<int>::const_iterator it;
  64. for (it = szlaki[u].begin(); it != szlaki[u].end(); ++it) {
  65. if (odl[1 - k][*it] == INFTY) {
  66. odl[1 - k][*it] = d;
  67. q[1 - k][kon[1 - k]++] = *it;
  68. }
  69. }
  70. if (pocz[k] == kon[k]) {
  71. k = 1 - k;
  72. ++d;
  73. }
  74. }
  75. return (odl[c%2][b] <= c);
  76. }
  77.  
  78. int main() {
  79. wczytaj_dane();
  80. for (int i = 0; i < k; ++i) {
  81. if (sprawdz_przygode(przygody[i])) {
  82. printf("TAK\n");
  83. } else {
  84. printf("NIE\n");
  85. }
  86. }
  87. return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement