#include <iostream> #define MAXSIZE 200002 long long zysk[MAXSIZE]; int polaczeniaZ[MAXSIZE]; int polaczeniaDo[MAXSIZE]; long long polaczeniaKoszt[MAXSIZE]; int polaczeniaStart[MAXSIZE]; int polaczeniaMiastaIlosc[MAXSIZE]; int polaczeniaIndex[MAXSIZE * 2]; int poloczeniaZliczane[MAXSIZE]; int miastaOdwiedzone[MAXSIZE]; int miastaDoPrzeszukania[MAXSIZE]; bool miastaPrzeszukane[MAXSIZE]; long long kosztDojazdu[MAXSIZE]; using namespace std; int main() { int iloscMiast; int iloscDni; //Przyjęcie danych cin >> iloscMiast; cin >> iloscDni; for (int i = 1; i <= iloscMiast; i++) cin >> zysk[i]; for (int i = 1; i < iloscMiast; i++) { cin >> polaczeniaZ[i]; cin >> polaczeniaDo[i]; cin >> polaczeniaKoszt[i]; polaczeniaMiastaIlosc[polaczeniaZ[i]]++; polaczeniaMiastaIlosc[polaczeniaDo[i]]++; } //obróbka danych for (int i = 1; i <= iloscMiast; i++) { polaczeniaStart[i] = polaczeniaStart[i - 1] + polaczeniaMiastaIlosc[i - 1]; } for (int i = 1; i < iloscMiast; i++) { int m1 = polaczeniaZ[i]; int m2 = polaczeniaDo[i]; int placeM1 = polaczeniaStart[m1] + poloczeniaZliczane[m1]++; int placeM2 = polaczeniaStart[m2] + poloczeniaZliczane[m2]++; polaczeniaIndex[placeM1] = i; polaczeniaIndex[placeM2] = i; } int MiastoStartowe = 1; for (int dzien = 0; dzien < iloscDni; dzien++) { int typ; cin >> typ; if (typ == 1) { int miasto; long long NowyZysk; cin >> miasto; cin >> NowyZysk; zysk[miasto] = NowyZysk; } if (typ == 2) { int miasto1; int miasto2; long long NowyKoszt; cin >> miasto1; cin >> miasto2; cin >> NowyKoszt; for (int i = 1; i < iloscMiast; i++) { if (polaczeniaZ[i] == miasto1 && polaczeniaDo[i] == miasto2 || polaczeniaZ[i] == miasto2 && polaczeniaDo[i] == miasto1) { polaczeniaKoszt[i] = NowyKoszt; break; } } } //szukanie miasta for (int i = 1; i <= iloscMiast; i++) miastaDoPrzeszukania[i] = 0; for (int i = 1; i <= iloscMiast; i++) miastaPrzeszukane[i] = false; for (int i = 1; i <= iloscMiast; i++) kosztDojazdu[i] = 0; miastaDoPrzeszukania[1] = MiastoStartowe; miastaPrzeszukane[MiastoStartowe] = true; int IndexDoWstawiania = 2; int najlepszeMiasto = 0; for (int i = 1; i <= iloscMiast; i++) { int obecneMiasto = miastaDoPrzeszukania[i]; for (int j = polaczeniaStart[obecneMiasto]; j < polaczeniaStart[obecneMiasto] + polaczeniaMiastaIlosc[obecneMiasto]; j++) { int polaczenie = polaczeniaIndex[j]; int doceloweMiasto = 0; if (polaczeniaZ[polaczenie] != obecneMiasto) doceloweMiasto = polaczeniaZ[polaczenie]; if (polaczeniaDo[polaczenie] != obecneMiasto) doceloweMiasto = polaczeniaDo[polaczenie]; if (miastaPrzeszukane[doceloweMiasto]) continue; miastaPrzeszukane[doceloweMiasto] = true; kosztDojazdu[doceloweMiasto] = polaczeniaKoszt[polaczenie] + kosztDojazdu[obecneMiasto]; miastaDoPrzeszukania[IndexDoWstawiania++] = doceloweMiasto; //sprawdzenie czy wiekszy zysk w tym miescie if (najlepszeMiasto == 0) najlepszeMiasto = doceloweMiasto; else if (zysk[doceloweMiasto] - kosztDojazdu[doceloweMiasto] > zysk[najlepszeMiasto] - kosztDojazdu[najlepszeMiasto]) najlepszeMiasto = doceloweMiasto; else if ((zysk[doceloweMiasto] - kosztDojazdu[doceloweMiasto] == zysk[najlepszeMiasto] - kosztDojazdu[najlepszeMiasto]) && doceloweMiasto < najlepszeMiasto) najlepszeMiasto = doceloweMiasto; } } miastaOdwiedzone[dzien] = najlepszeMiasto; MiastoStartowe = najlepszeMiasto; } //wypisanie wyniku for (int i = 0; i < iloscDni; i++) cout << miastaOdwiedzone[i] << " "; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #include <iostream> #define MAXSIZE 200002 long long zysk[MAXSIZE]; int polaczeniaZ[MAXSIZE]; int polaczeniaDo[MAXSIZE]; long long polaczeniaKoszt[MAXSIZE]; int polaczeniaStart[MAXSIZE]; int polaczeniaMiastaIlosc[MAXSIZE]; int polaczeniaIndex[MAXSIZE * 2]; int poloczeniaZliczane[MAXSIZE]; int miastaOdwiedzone[MAXSIZE]; int miastaDoPrzeszukania[MAXSIZE]; bool miastaPrzeszukane[MAXSIZE]; long long kosztDojazdu[MAXSIZE]; using namespace std; int main() { int iloscMiast; int iloscDni; //Przyjęcie danych cin >> iloscMiast; cin >> iloscDni; for (int i = 1; i <= iloscMiast; i++) cin >> zysk[i]; for (int i = 1; i < iloscMiast; i++) { cin >> polaczeniaZ[i]; cin >> polaczeniaDo[i]; cin >> polaczeniaKoszt[i]; polaczeniaMiastaIlosc[polaczeniaZ[i]]++; polaczeniaMiastaIlosc[polaczeniaDo[i]]++; } //obróbka danych for (int i = 1; i <= iloscMiast; i++) { polaczeniaStart[i] = polaczeniaStart[i - 1] + polaczeniaMiastaIlosc[i - 1]; } for (int i = 1; i < iloscMiast; i++) { int m1 = polaczeniaZ[i]; int m2 = polaczeniaDo[i]; int placeM1 = polaczeniaStart[m1] + poloczeniaZliczane[m1]++; int placeM2 = polaczeniaStart[m2] + poloczeniaZliczane[m2]++; polaczeniaIndex[placeM1] = i; polaczeniaIndex[placeM2] = i; } int MiastoStartowe = 1; for (int dzien = 0; dzien < iloscDni; dzien++) { int typ; cin >> typ; if (typ == 1) { int miasto; long long NowyZysk; cin >> miasto; cin >> NowyZysk; zysk[miasto] = NowyZysk; } if (typ == 2) { int miasto1; int miasto2; long long NowyKoszt; cin >> miasto1; cin >> miasto2; cin >> NowyKoszt; for (int i = 1; i < iloscMiast; i++) { if (polaczeniaZ[i] == miasto1 && polaczeniaDo[i] == miasto2 || polaczeniaZ[i] == miasto2 && polaczeniaDo[i] == miasto1) { polaczeniaKoszt[i] = NowyKoszt; break; } } } //szukanie miasta for (int i = 1; i <= iloscMiast; i++) miastaDoPrzeszukania[i] = 0; for (int i = 1; i <= iloscMiast; i++) miastaPrzeszukane[i] = false; for (int i = 1; i <= iloscMiast; i++) kosztDojazdu[i] = 0; miastaDoPrzeszukania[1] = MiastoStartowe; miastaPrzeszukane[MiastoStartowe] = true; int IndexDoWstawiania = 2; int najlepszeMiasto = 0; for (int i = 1; i <= iloscMiast; i++) { int obecneMiasto = miastaDoPrzeszukania[i]; for (int j = polaczeniaStart[obecneMiasto]; j < polaczeniaStart[obecneMiasto] + polaczeniaMiastaIlosc[obecneMiasto]; j++) { int polaczenie = polaczeniaIndex[j]; int doceloweMiasto = 0; if (polaczeniaZ[polaczenie] != obecneMiasto) doceloweMiasto = polaczeniaZ[polaczenie]; if (polaczeniaDo[polaczenie] != obecneMiasto) doceloweMiasto = polaczeniaDo[polaczenie]; if (miastaPrzeszukane[doceloweMiasto]) continue; miastaPrzeszukane[doceloweMiasto] = true; kosztDojazdu[doceloweMiasto] = polaczeniaKoszt[polaczenie] + kosztDojazdu[obecneMiasto]; miastaDoPrzeszukania[IndexDoWstawiania++] = doceloweMiasto; //sprawdzenie czy wiekszy zysk w tym miescie if (najlepszeMiasto == 0) najlepszeMiasto = doceloweMiasto; else if (zysk[doceloweMiasto] - kosztDojazdu[doceloweMiasto] > zysk[najlepszeMiasto] - kosztDojazdu[najlepszeMiasto]) najlepszeMiasto = doceloweMiasto; else if ((zysk[doceloweMiasto] - kosztDojazdu[doceloweMiasto] == zysk[najlepszeMiasto] - kosztDojazdu[najlepszeMiasto]) && doceloweMiasto < najlepszeMiasto) najlepszeMiasto = doceloweMiasto; } } miastaOdwiedzone[dzien] = najlepszeMiasto; MiastoStartowe = najlepszeMiasto; } //wypisanie wyniku for (int i = 0; i < iloscDni; i++) cout << miastaOdwiedzone[i] << " "; return 0; } |