#include<iostream> #include<vector> using namespace std; long long zarobek_max=0; int id_max; struct wierzcholki{ vector < pair < long long, long long > > polaczenia; //połączenia wychodzące z danego wierzchołka bool odwiedzony; //okresla, czy wierzchołek został odwiedzony long long zarobek;//dodatkowe dane dla danego wierzchołka //........................ //........................ }*w; void w_glab(int k, long long koszt, long long dojazd, int pocz) { w[k].odwiedzony = 1; koszt+=dojazd; if(w[k].zarobek-koszt>zarobek_max||id_max==pocz){ zarobek_max = w[k].zarobek-koszt; id_max=k; }else if(w[k].zarobek-koszt==zarobek_max&&k<id_max){ zarobek_max = w[k].zarobek-koszt; id_max=k; } for(int i=0; i<w[k].polaczenia.size(); i++){ //jesli wierzchołek, do którego chcemy przejsć nie został //jeszcze odwiedzony if(!w[w[k].polaczenia[i].first].odwiedzony) //to przechodzimy do niego w_glab(w[k].polaczenia[i].first, koszt, w[k].polaczenia[i].second, pocz); } } int main(){ int n, q, pocz=0, a, b; long long zarobek, koszt=0, dojazd=0; id_max=pocz; scanf("%d%d", &n, &q); w = new wierzcholki[n+1]; for(int i=0; i<n; i++){ scanf("%lld", &zarobek); w[i].zarobek = zarobek; } for(int i=0; i<n-1; i++){ scanf("%d%d%lld", &a, &b, &koszt); w[a-1].polaczenia.push_back(make_pair(b-1, koszt)); w[b-1].polaczenia.push_back(make_pair(a-1, koszt)); } for(int i = 0; i < q; i++){ int zmiana; scanf("%d", &zmiana); if(zmiana==1){ int zmiana_id; scanf("%d", &zmiana_id); zmiana_id--; scanf("%lld", &w[zmiana_id].zarobek); }else{ int zmiana_id_1; int zmiana_id_2; long long zmiana_koszt; scanf("%d%d%lld", &zmiana_id_1, &zmiana_id_2, &zmiana_koszt); zmiana_id_1--; zmiana_id_2--; for(int j=0; j<w[zmiana_id_1].polaczenia.size(); j++){ if(w[zmiana_id_1].polaczenia[j].first==zmiana_id_2){ w[zmiana_id_1].polaczenia[j].second = zmiana_koszt; } } for(int j=0; j<w[zmiana_id_2].polaczenia.size(); j++){ if(w[zmiana_id_2].polaczenia[j].first==zmiana_id_1){ w[zmiana_id_2].polaczenia[j].second = zmiana_koszt; } } } zarobek=w[id_max].zarobek; w_glab(id_max, koszt, dojazd, pocz); pocz = id_max; if(i+1!=q){ for(int j =0; j < n; j++){ w[j].odwiedzony=0; } } printf("%d ", id_max+1); } }
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 | #include<iostream> #include<vector> using namespace std; long long zarobek_max=0; int id_max; struct wierzcholki{ vector < pair < long long, long long > > polaczenia; //połączenia wychodzące z danego wierzchołka bool odwiedzony; //okresla, czy wierzchołek został odwiedzony long long zarobek;//dodatkowe dane dla danego wierzchołka //........................ //........................ }*w; void w_glab(int k, long long koszt, long long dojazd, int pocz) { w[k].odwiedzony = 1; koszt+=dojazd; if(w[k].zarobek-koszt>zarobek_max||id_max==pocz){ zarobek_max = w[k].zarobek-koszt; id_max=k; }else if(w[k].zarobek-koszt==zarobek_max&&k<id_max){ zarobek_max = w[k].zarobek-koszt; id_max=k; } for(int i=0; i<w[k].polaczenia.size(); i++){ //jesli wierzchołek, do którego chcemy przejsć nie został //jeszcze odwiedzony if(!w[w[k].polaczenia[i].first].odwiedzony) //to przechodzimy do niego w_glab(w[k].polaczenia[i].first, koszt, w[k].polaczenia[i].second, pocz); } } int main(){ int n, q, pocz=0, a, b; long long zarobek, koszt=0, dojazd=0; id_max=pocz; scanf("%d%d", &n, &q); w = new wierzcholki[n+1]; for(int i=0; i<n; i++){ scanf("%lld", &zarobek); w[i].zarobek = zarobek; } for(int i=0; i<n-1; i++){ scanf("%d%d%lld", &a, &b, &koszt); w[a-1].polaczenia.push_back(make_pair(b-1, koszt)); w[b-1].polaczenia.push_back(make_pair(a-1, koszt)); } for(int i = 0; i < q; i++){ int zmiana; scanf("%d", &zmiana); if(zmiana==1){ int zmiana_id; scanf("%d", &zmiana_id); zmiana_id--; scanf("%lld", &w[zmiana_id].zarobek); }else{ int zmiana_id_1; int zmiana_id_2; long long zmiana_koszt; scanf("%d%d%lld", &zmiana_id_1, &zmiana_id_2, &zmiana_koszt); zmiana_id_1--; zmiana_id_2--; for(int j=0; j<w[zmiana_id_1].polaczenia.size(); j++){ if(w[zmiana_id_1].polaczenia[j].first==zmiana_id_2){ w[zmiana_id_1].polaczenia[j].second = zmiana_koszt; } } for(int j=0; j<w[zmiana_id_2].polaczenia.size(); j++){ if(w[zmiana_id_2].polaczenia[j].first==zmiana_id_1){ w[zmiana_id_2].polaczenia[j].second = zmiana_koszt; } } } zarobek=w[id_max].zarobek; w_glab(id_max, koszt, dojazd, pocz); pocz = id_max; if(i+1!=q){ for(int j =0; j < n; j++){ w[j].odwiedzony=0; } } printf("%d ", id_max+1); } } |